{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# [对 Stack Overflow 问题进行多类分类](https://www.tensorflow.org/tutorials/keras/text_classification?hl=zh-cn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-01-22 10:23:34.110151: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
      "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import os\n",
    "import re\n",
    "import shutil\n",
    "import string\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras import regularizers\n",
    "from tensorflow.keras import layers\n",
    "from tensorflow.keras import losses"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.13.0\n"
     ]
    }
   ],
   "source": [
    "print(tf.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "url = \"https://storage.googleapis.com/download.tensorflow.org/data/stack_overflow_16k.tar.gz\"\n",
    "\n",
    "dataset = tf.keras.utils.get_file(\"stack_overflow\", url,\n",
    "                                    untar=True, cache_dir='./data',\n",
    "                                    cache_subdir='stack_overflow')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "./data/stack_overflow\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "['stack_overflow.tar.gz', 'README.md', 'train', 'test']"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(os.path.dirname(dataset))\n",
    "\n",
    "# dataset_dir = os.path.join(os.path.dirname(dataset), 'stack_overflow')\n",
    "dataset_dir = os.path.dirname(dataset)\n",
    "os.listdir(dataset_dir)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['python', 'java', 'csharp', 'javascript']"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_dir = os.path.join(dataset_dir, 'train')\n",
    "os.listdir(train_dir)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\"add version to @@webservice i'm using blankx.jws.webservice to create my webservice, in addition to targetnamespace i would like to include a \"\"version\"\" attribute to mark the version of my service. what other tag can i use in addition to this one to accomplish this so my wdsl will look like:..&lt;schema targetnamespace=\"\"http://example.com/2009/02/15/webservice\"\" version=\"\"1.1\"\" xmlns=\"\"http://www.w3.org/2000/10/xmlschema&gt;...i.e. it has a version attribute\"\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sample_file = os.path.join(train_dir, 'java/1.txt')\n",
    "with open(sample_file) as f:\n",
    "  print(f.read())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# remove_dir = os.path.join(train_dir, 'unsup')\n",
    "# shutil.rmtree(remove_dir)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 8000 files belonging to 4 classes.\n",
      "Using 6400 files for training.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-01-22 10:23:46.815529: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1639] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 10400 MB memory:  -> device: 0, name: NVIDIA GeForce RTX 3060, pci bus id: 0000:09:00.0, compute capability: 8.6\n"
     ]
    }
   ],
   "source": [
    "batch_size = 32\n",
    "seed = 42\n",
    "\n",
    "raw_train_ds = tf.keras.utils.text_dataset_from_directory(\n",
    "    f'{dataset_dir}/train', \n",
    "    batch_size=batch_size, \n",
    "    validation_split=0.2, \n",
    "    subset='training', \n",
    "    seed=seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Review b'\"my tester is going to the wrong constructor i am new to programming so if i ask a question that can be easily fixed, please forgive me. my program has a tester class with a main. when i send that to my regularpolygon class, it sends it to the wrong constructor. i have two constructors. 1 without perameters..public regularpolygon().    {.       mynumsides = 5;.       mysidelength = 30;.    }//end default constructor...and my second, with perameters. ..public regularpolygon(int numsides, double sidelength).    {.        mynumsides = numsides;.        mysidelength = sidelength;.    }// end constructor...in my tester class i have these two lines:..regularpolygon shape = new regularpolygon(numsides, sidelength);.        shape.menu();...numsides and sidelength were declared and initialized earlier in the testing class...so what i want to happen, is the tester class sends numsides and sidelength to the second constructor and use it in that class. but it only uses the default constructor, which therefor ruins the whole rest of the program. can somebody help me?..for those of you who want to see more of my code: here you go..public double vertexangle().    {.        system.out.println(\"\"the vertex angle method: \"\" + mynumsides);// prints out 5.        system.out.println(\"\"the vertex angle method: \"\" + mysidelength); // prints out 30..        double vertexangle;.        vertexangle = ((mynumsides - 2.0) / mynumsides) * 180.0;.        return vertexangle;.    }//end method vertexangle..public void menu().{.    system.out.println(mynumsides); // prints out what the user puts in.    system.out.println(mysidelength); // prints out what the user puts in.    gotographic();.    calcr(mynumsides, mysidelength);.    calcr(mynumsides, mysidelength);.    print(); .}// end menu...this is my entire tester class:..public static void main(string[] arg).{.    int numsides;.    double sidelength;.    scanner keyboard = new scanner(system.in);..    system.out.println(\"\"welcome to the regular polygon program!\"\");.    system.out.println();..    system.out.print(\"\"enter the number of sides of the polygon ==&gt; \"\");.    numsides = keyboard.nextint();.    system.out.println();..    system.out.print(\"\"enter the side length of each side ==&gt; \"\");.    sidelength = keyboard.nextdouble();.    system.out.println();..    regularpolygon shape = new regularpolygon(numsides, sidelength);.    shape.menu();.}//end main...for testing it i sent it numsides 4 and sidelength 100.\"\\n'\n",
      "Label 1\n",
      "Review b'\"blank code slow skin detection this code changes the color space to lab and using a threshold finds the skin area of an image. but it\\'s ridiculously slow. i don\\'t know how to make it faster ?    ..from colormath.color_objects import *..def skindetection(img, treshold=80, color=[255,20,147]):..    print img.shape.    res=img.copy().    for x in range(img.shape[0]):.        for y in range(img.shape[1]):.            rgbimg=rgbcolor(img[x,y,0],img[x,y,1],img[x,y,2]).            labimg=rgbimg.convert_to(\\'lab\\', debug=false).            if (labimg.lab_l &gt; treshold):.                res[x,y,:]=color.            else: .                res[x,y,:]=img[x,y,:]..    return res\"\\n'\n",
      "Label 3\n",
      "Review b'\"option and validation in blank i want to add a new option on my system where i want to add two text files, both rental.txt and customer.txt. inside each text are id numbers of the customer, the videotape they need and the price...i want to place it as an option on my code. right now i have:...add customer.rent return.view list.search.exit...i want to add this as my sixth option. say for example i ordered a video, it would display the price and would let me confirm the price and if i am going to buy it or not...here is my current code:..  import blank.io.*;.    import blank.util.arraylist;.    import static blank.lang.system.out;..    public class rentalsystem{.    static bufferedreader input = new bufferedreader(new inputstreamreader(system.in));.    static file file = new file(\"\"file.txt\"\");.    static arraylist&lt;string&gt; list = new arraylist&lt;string&gt;();.    static int rows;..    public static void main(string[] args) throws exception{.        introduction();.        system.out.print(\"\"nn\"\");.        login();.        system.out.print(\"\"nnnnnnnnnnnnnnnnnnnnnn\"\");.        introduction();.        string repeat;.        do{.            loadfile();.            system.out.print(\"\"nwhat do you want to do?nn\"\");.            system.out.print(\"\"n                    - - - - - - - - - - - - - - - - - - - - - - -\"\");.            system.out.print(\"\"nn                    |     1. add customer    |   2. rent return |n\"\");.            system.out.print(\"\"n                    - - - - - - - - - - - - - - - - - - - - - - -\"\");.            system.out.print(\"\"nn                    |     3. view list       |   4. search      |n\"\");.            system.out.print(\"\"n                    - - - - - - - - - - - - - - - - - - - - - - -\"\");.            system.out.print(\"\"nn                                             |   5. exit        |n\"\");.            system.out.print(\"\"n                                              - - - - - - - - - -\"\");.            system.out.print(\"\"nnchoice:\"\");.            int choice = integer.parseint(input.readline());.            switch(choice){.                case 1:.                    writedata();.                    break;.                case 2:.                    rentdata();.                    break;.                case 3:.                    viewlist();.                    break;.                case 4:.                    search();.                    break;.                case 5:.                    system.out.println(\"\"goodbye!\"\");.                    system.exit(0);.                default:.                    system.out.print(\"\"invalid choice: \"\");.                    break;.            }.            system.out.print(\"\"ndo another task? [y/n] \"\");.            repeat = input.readline();.        }while(repeat.equals(\"\"y\"\"));..        if(repeat!=\"\"y\"\") system.out.println(\"\"ngoodbye!\"\");..    }..    public static void writedata() throws exception{.        system.out.print(\"\"nname: \"\");.        string cname = input.readline();.        system.out.print(\"\"address: \"\");.        string add = input.readline();.        system.out.print(\"\"phone no.: \"\");.        string pno = input.readline();.        system.out.print(\"\"rental amount: \"\");.        string ramount = input.readline();.        system.out.print(\"\"tapenumber: \"\");.        string tno = input.readline();.        system.out.print(\"\"title: \"\");.        string title = input.readline();.        system.out.print(\"\"date borrowed: \"\");.        string dborrowed = input.readline();.        system.out.print(\"\"due date: \"\");.        string ddate = input.readline();.        createline(cname, add, pno, ramount,tno, title, dborrowed, ddate);.        rentdata();.    }..    public static void createline(string name, string address, string phone , string rental, string tapenumber, string title, string borrowed, string due) throws exception{.        filewriter fw = new filewriter(file, true);.        fw.write(\"\"nname: \"\"+name + \"\"naddress: \"\" + address +\"\"nphone no.: \"\"+ phone+\"\"nrentalamount: \"\"+rental+\"\"ntape no.: \"\"+ tapenumber+\"\"ntitle: \"\"+ title+\"\"ndate borrowed: \"\"+borrowed +\"\"ndue date: \"\"+ due+\"\":rn\"\");.        fw.close();.    }..    public static void loadfile() throws exception{.        try{.            list.clear();.            fileinputstream fstream = new fileinputstream(file);.            bufferedreader br = new bufferedreader(new inputstreamreader(fstream));.            rows = 0;.            while( br.ready()).            {.                list.add(br.readline());.                rows++;.            }.            br.close();.        } catch(exception e){.            system.out.println(\"\"list not yet loaded.\"\");.        }.    }..    public static void viewlist(){.        system.out.print(\"\"n~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\"\");.        system.out.print(\"\" |list of all costumers|\"\");.        system.out.print(\"\"~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\"\");.        for(int i = 0; i &lt;rows; i++){.            system.out.println(list.get(i));.        }.    }.        public static void rentdata()throws exception.    {   system.out.print(\"\"n~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\"\");.        system.out.print(\"\" |rent data list|\"\");.        system.out.print(\"\"~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\"\");.        system.out.print(\"\"nenter customer name: \"\");.        string cname = input.readline();.        system.out.print(\"\"date borrowed: \"\");.        string dborrowed = input.readline();.        system.out.print(\"\"due date: \"\");.        string ddate = input.readline();.        system.out.print(\"\"return date: \"\");.        string rdate = input.readline();.        system.out.print(\"\"rent amount: \"\");.        string ramount = input.readline();..        system.out.print(\"\"you pay:\"\"+ramount);...    }.    public static void search()throws exception.    {   system.out.print(\"\"n~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\"\");.        system.out.print(\"\" |search costumers|\"\");.        system.out.print(\"\"~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\"\");.        system.out.print(\"\"nenter costumer name: \"\");.        string cname = input.readline();.        boolean found = false;..        for(int i=0; i &lt; rows; i++){.            string temp[] = list.get(i).split(\"\",\"\");..            if(cname.equals(temp[0])){.            system.out.println(\"\"search result:nyou are \"\" + temp[0] + \"\" from \"\" + temp[1] + \"\".\"\"+ temp[2] + \"\".\"\"+ temp[3] + \"\".\"\"+ temp[4] + \"\".\"\"+ temp[5] + \"\" is \"\" + temp[6] + \"\".\"\"+ temp[7] + \"\" is \"\" + temp[8] + \"\".\"\");.                found = true;.            }.        }..        if(!found){.            system.out.print(\"\"no results.\"\");.        }..    }..        public static boolean evaluate(string uname, string pass){.        if (uname.equals(\"\"admin\"\")&amp;&amp;pass.equals(\"\"12345\"\")) return true;.        else return false;.    }..    public static string login()throws exception{.        bufferedreader input=new bufferedreader(new inputstreamreader(system.in));.        int counter=0;.        do{.            system.out.print(\"\"username:\"\");.            string uname =input.readline();.            system.out.print(\"\"password:\"\");.            string pass =input.readline();..            boolean accept= evaluate(uname,pass);..            if(accept){.                break;.                }else{.                    system.out.println(\"\"incorrect username or password!\"\");.                    counter ++;.                    }.        }while(counter&lt;3);..            if(counter !=3) return \"\"login successful\"\";.            else return \"\"login failed\"\";.            }.        public static void introduction() throws exception{..        system.out.println(\"\"                  - - - - - - - - - - - - - - - - - - - - - - - - -\"\");.        system.out.println(\"\"                  !                  r e n t a l                  !\"\");.        system.out.println(\"\"                   ! ~ ~ ~ ~ ~ !  =================  ! ~ ~ ~ ~ ~ !\"\");.        system.out.println(\"\"                  !                  s y s t e m                  !\"\");.        system.out.println(\"\"                  - - - - - - - - - - - - - - - - - - - - - - - - -\"\");.        }..}\"\\n'\n",
      "Label 1\n"
     ]
    }
   ],
   "source": [
    "for text_batch, label_batch in raw_train_ds.take(1):\n",
    "    for i in range(3):\n",
    "        print(\"Review\", text_batch.numpy()[i])\n",
    "        print(\"Label\", label_batch.numpy()[i])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Label 0 corresponds to csharp\n",
      "Label 1 corresponds to java\n"
     ]
    }
   ],
   "source": [
    "print(\"Label 0 corresponds to\", raw_train_ds.class_names[0])\n",
    "print(\"Label 1 corresponds to\", raw_train_ds.class_names[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 8000 files belonging to 4 classes.\n",
      "Using 1600 files for validation.\n"
     ]
    }
   ],
   "source": [
    "raw_val_ds = tf.keras.utils.text_dataset_from_directory(\n",
    "    f'{dataset_dir}/train', \n",
    "    batch_size=batch_size, \n",
    "    validation_split=0.2, \n",
    "    subset='validation', \n",
    "    seed=seed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 8000 files belonging to 4 classes.\n"
     ]
    }
   ],
   "source": [
    "raw_test_ds = tf.keras.utils.text_dataset_from_directory(\n",
    "    f'{dataset_dir}/test', \n",
    "    batch_size=batch_size)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，您将使用有用的 tf.keras.layers.TextVectorization 层对数据进行标准化、词例化和向量化。\n",
    "\n",
    "标准化是指对文本进行预处理，通常是移除标点符号或 HTML 元素以简化数据集。词例化是指将字符串分割成词例（例如，通过空格将句子分割成单个单词）。向量化是指将词例转换为数字，以便将它们输入神经网络。所有这些任务都可以通过这个层完成。\n",
    "\n",
    "正如您在上面看到的，评论包含各种 HTML 代码，例如 <br />。TextVectorization 层（默认情况下会将文本转换为小写并去除标点符号，但不会去除 HTML）中的默认标准化程序不会移除这些代码。您将编写一个自定义标准化函数来移除 HTML。\n",
    "\n",
    "注：为了防止训练-测试偏差（也称为训练-应用偏差），在训练和测试时间对数据进行相同的预处理非常重要。为此，可以将 TextVectorization 层直接包含在模型中，如本教程后面所示。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def custom_standardization(input_data):\n",
    "    lowercase = tf.strings.lower(input_data)\n",
    "    stripped_html = tf.strings.regex_replace(lowercase, '<br />', ' ')\n",
    "    return tf.strings.regex_replace(stripped_html,\n",
    "                                    '[%s]' % re.escape(string.punctuation),\n",
    "                                    '')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "max_features = 10000\n",
    "sequence_length = 250\n",
    "\n",
    "vectorize_layer = layers.TextVectorization(\n",
    "    standardize=custom_standardization,\n",
    "    max_tokens=max_features,\n",
    "    output_mode='int',\n",
    "    output_sequence_length=sequence_length)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Make a text-only dataset (without labels), then call adapt\n",
    "train_text = raw_train_ds.map(lambda x, y: x)\n",
    "vectorize_layer.adapt(train_text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def vectorize_text(text, label):\n",
    "    text = tf.expand_dims(text, -1)\n",
    "    return vectorize_layer(text), label"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Review tf.Tensor(b'\"set blank to quit on exception? i\\'m using blank 3..i\\'ve been looking around for an answer to this, but i haven\\'t found it yet. basically, i\\'m running several blank scripts into a game engine, and each script has its own entry point...i\\'d rather not add try: except blocks through all of my code, so i was wondering if it\\'s at all possible to tell blank to quit (or perhaps assign a custom function to that \"\"callback\"\") on finding its first error, regardless of where or what it found? ..currently, the game engine will continue after finding and hitting an error, making it more difficult than necessary to diagnose issues since running into one error may make a subsequent script not work (as it relies on variables that the error-ing script set, for example). any ideas? ..i know that i could redirect the console to a file to allow for easier scrolling, but just capturing the first error and stopping the game prematurely would be really useful...okay, a couple of extra bits of info - sorry for neglecting to say this. the engine i\\'m using (the blender game engine) is coded in c, so changing the source is more than i\\'d like to do.....after googling, it would appear that a similar question with a solid answer has been asked here, which is how to get the last raised exception. if i check the sys module for the presence of the last_value variable and it exists, then i can quit prematurely, as the console would have already printed out the error...thanks for the help.\"\\n', shape=(), dtype=string)\n",
      "Label python\n",
      "Vectorized review (<tf.Tensor: shape=(1, 250), dtype=int64, numpy=\n",
      "array([[ 107,   16,    4, 1139,   37,  184,   52,   47,   16,    1,  215,\n",
      "         417,  518,   12,   32,  182,    4,   13,   26,    3, 1416,  227,\n",
      "          11,  894,  627,   52,  309,  718,   16, 1274,  100,    5,  244,\n",
      "        1826,    8,  119,  224,   95,   97,  657,  858,    1,  797,   20,\n",
      "         125,  117,  559, 2282,  194,   73,    9,   23,   30,   50,    3,\n",
      "         115,  566,   10,   97,   59,   73,  204,    4,  412,   16,    4,\n",
      "        1139,   45, 1670,  601,    5,  694,   38,    4,   14,  851,   37,\n",
      "         967,   97,   98,   65, 2374,    9,  132,   45,   55,   11,  227,\n",
      "         401,    2,  244, 1826,   72,  534,  156,  967,    8, 7808,   32,\n",
      "          65,  468,   11,  181, 2332,  198, 1461,    4,    1, 1093,  447,\n",
      "         309,  100,   71,   65,  454,  109,    5, 3560,  224,   20,  139,\n",
      "          36,   11, 9052,   37,  233,   14,    2,    1,  224,  107,   12,\n",
      "         137,   76,  779,    3,  102,   14,    3,  176, 1853,    2,  332,\n",
      "           4,    5,   39,    4,  787,   12, 1320, 3579,   26,  106,    1,\n",
      "           2,   98,   65,    8, 2902,    2,  244,    1,   69,   33,  336,\n",
      "           1,    5, 1759,    9, 1157, 2531,    9,  568,  729,   12,    1,\n",
      "           4,  321,   13,    2, 1826,   52,   47,    2,    1,  244, 1826,\n",
      "           6, 2619,    7,  131,   50,  801,    2,  313,    6,  181,  198,\n",
      "         142,   48,    4,    1, 3965,   11,   69,  882,   14,    5,  520,\n",
      "         159,   21,    5, 1706,  182,   95,  215,  912,  101,   66,    6,\n",
      "          24,    4,   41,    2,  218, 2918,  184,   10,    3,  186,    2,\n",
      "        1358,  380,   12,    2, 9151,    9,    2,    1,  116,    8,   11,\n",
      "         758,   87,    3,   35, 1139,    1,   36,    2]])>, <tf.Tensor: shape=(), dtype=int32, numpy=3>)\n"
     ]
    }
   ],
   "source": [
    "# retrieve a batch (of 32 reviews and labels) from the dataset\n",
    "text_batch, label_batch = next(iter(raw_train_ds))\n",
    "first_review, first_label = text_batch[0], label_batch[0]\n",
    "print(\"Review\", first_review)\n",
    "print(\"Label\", raw_train_ds.class_names[first_label])\n",
    "print(\"Vectorized review\", vectorize_text(first_review, first_label))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1287 --->  scissors\n",
      " 313 --->  source\n",
      "Vocabulary size: 10000\n"
     ]
    }
   ],
   "source": [
    "print(\"1287 ---> \",vectorize_layer.get_vocabulary()[1287])\n",
    "print(\" 313 ---> \",vectorize_layer.get_vocabulary()[313])\n",
    "print('Vocabulary size: {}'.format(len(vectorize_layer.get_vocabulary())))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_ds = raw_train_ds.map(vectorize_text)\n",
    "val_ds = raw_val_ds.map(vectorize_text)\n",
    "test_ds = raw_test_ds.map(vectorize_text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "AUTOTUNE = tf.data.AUTOTUNE\n",
    "\n",
    "train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)\n",
    "val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)\n",
    "test_ds = test_ds.cache().prefetch(buffer_size=AUTOTUNE)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "embedding_dim = 128"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      " Layer (type)                Output Shape              Param #   \n",
      "=================================================================\n",
      " embedding (Embedding)       (None, None, 128)         1280128   \n",
      "                                                                 \n",
      " dropout (Dropout)           (None, None, 128)         0         \n",
      "                                                                 \n",
      " dense (Dense)               (None, None, 64)          8256      \n",
      "                                                                 \n",
      " dropout_1 (Dropout)         (None, None, 64)          0         \n",
      "                                                                 \n",
      " global_average_pooling1d (  (None, 64)                0         \n",
      " GlobalAveragePooling1D)                                         \n",
      "                                                                 \n",
      " dense_1 (Dense)             (None, 32)                2080      \n",
      "                                                                 \n",
      " dropout_2 (Dropout)         (None, 32)                0         \n",
      "                                                                 \n",
      " dense_2 (Dense)             (None, 4)                 132       \n",
      "                                                                 \n",
      "=================================================================\n",
      "Total params: 1290596 (4.92 MB)\n",
      "Trainable params: 1290596 (4.92 MB)\n",
      "Non-trainable params: 0 (0.00 Byte)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = tf.keras.Sequential([\n",
    "    layers.Embedding(max_features + 1, embedding_dim),\n",
    "    layers.Dropout(0.5),\n",
    "    layers.Dense(64, kernel_regularizer=regularizers.l2(0.0001),),\n",
    "    layers.Dropout(0.5),\n",
    "    layers.GlobalAveragePooling1D(),\n",
    "    layers.Dense(32, kernel_regularizer=regularizers.l2(0.0001),),\n",
    "    layers.Dropout(0.5),\n",
    "    layers.Dense(4)])\n",
    "\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss=losses.SparseCategoricalCrossentropy(from_logits=True),\n",
    "              optimizer='adam',\n",
    "              metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/30\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2025-01-22 10:23:52.757045: I tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:606] TensorFloat-32 will be used for the matrix multiplication. This will only be logged once.\n",
      "2025-01-22 10:23:52.812736: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x1490fc057170 initialized for platform CUDA (this does not guarantee that XLA will be used). Devices:\n",
      "2025-01-22 10:23:52.812819: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): NVIDIA GeForce RTX 3060, Compute Capability 8.6\n",
      "2025-01-22 10:23:52.821313: I tensorflow/compiler/mlir/tensorflow/utils/dump_mlir_util.cc:255] disabling MLIR crash reproducer, set env var `MLIR_CRASH_REPRODUCER_DIRECTORY` to enable.\n",
      "2025-01-22 10:23:52.845798: I tensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:432] Loaded cuDNN version 8900\n",
      "2025-01-22 10:23:53.058456: I ./tensorflow/compiler/jit/device_compiler.h:186] Compiled cluster using XLA!  This line is logged at most once for the lifetime of the process.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "200/200 [==============================] - ETA: 0s - loss: 1.3393 - accuracy: 0.3745\n",
      "Epoch 1: saving model to ../../checkpoints/cp-0001.ckpt\n",
      "200/200 [==============================] - 42s 197ms/step - loss: 1.3393 - accuracy: 0.3745 - val_loss: 1.0997 - val_accuracy: 0.6012\n",
      "Epoch 2/30\n",
      "193/200 [===========================>..] - ETA: 0s - loss: 0.8530 - accuracy: 0.6558\n",
      "Epoch 2: saving model to ../../checkpoints/cp-0002.ckpt\n",
      "200/200 [==============================] - 2s 8ms/step - loss: 0.8477 - accuracy: 0.6578 - val_loss: 0.6983 - val_accuracy: 0.7163\n",
      "Epoch 3/30\n",
      "199/200 [============================>.] - ETA: 0s - loss: 0.5995 - accuracy: 0.7745\n",
      "Epoch 3: saving model to ../../checkpoints/cp-0003.ckpt\n",
      "200/200 [==============================] - 2s 8ms/step - loss: 0.5980 - accuracy: 0.7752 - val_loss: 0.6321 - val_accuracy: 0.7487\n",
      "Epoch 4/30\n",
      "199/200 [============================>.] - ETA: 0s - loss: 0.4550 - accuracy: 0.8389\n",
      "Epoch 4: saving model to ../../checkpoints/cp-0004.ckpt\n",
      "200/200 [==============================] - 2s 8ms/step - loss: 0.4545 - accuracy: 0.8392 - val_loss: 0.6814 - val_accuracy: 0.7462\n",
      "Epoch 5/30\n",
      "195/200 [============================>.] - ETA: 0s - loss: 0.3631 - accuracy: 0.8851\n",
      "Epoch 5: saving model to ../../checkpoints/cp-0005.ckpt\n",
      "200/200 [==============================] - 2s 8ms/step - loss: 0.3626 - accuracy: 0.8855 - val_loss: 0.6706 - val_accuracy: 0.7650\n",
      "Epoch 6/30\n",
      "196/200 [============================>.] - ETA: 0s - loss: 0.2981 - accuracy: 0.9080\n",
      "Epoch 6: saving model to ../../checkpoints/cp-0006.ckpt\n",
      "200/200 [==============================] - 2s 8ms/step - loss: 0.2992 - accuracy: 0.9075 - val_loss: 0.7163 - val_accuracy: 0.7669\n",
      "Epoch 7/30\n",
      "200/200 [==============================] - ETA: 0s - loss: 0.2386 - accuracy: 0.9345\n",
      "Epoch 7: saving model to ../../checkpoints/cp-0007.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.2386 - accuracy: 0.9345 - val_loss: 0.8335 - val_accuracy: 0.7631\n",
      "Epoch 8/30\n",
      "196/200 [============================>.] - ETA: 0s - loss: 0.2214 - accuracy: 0.9388\n",
      "Epoch 8: saving model to ../../checkpoints/cp-0008.ckpt\n",
      "200/200 [==============================] - 2s 8ms/step - loss: 0.2209 - accuracy: 0.9389 - val_loss: 0.8443 - val_accuracy: 0.7619\n",
      "Epoch 9/30\n",
      "199/200 [============================>.] - ETA: 0s - loss: 0.2010 - accuracy: 0.9466\n",
      "Epoch 9: saving model to ../../checkpoints/cp-0009.ckpt\n",
      "200/200 [==============================] - 2s 8ms/step - loss: 0.2014 - accuracy: 0.9467 - val_loss: 0.9793 - val_accuracy: 0.7519\n",
      "Epoch 10/30\n",
      "192/200 [===========================>..] - ETA: 0s - loss: 0.2048 - accuracy: 0.9434\n",
      "Epoch 10: saving model to ../../checkpoints/cp-0010.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.2075 - accuracy: 0.9423 - val_loss: 1.2815 - val_accuracy: 0.7225\n",
      "Epoch 11/30\n",
      "196/200 [============================>.] - ETA: 0s - loss: 0.1859 - accuracy: 0.9471\n",
      "Epoch 11: saving model to ../../checkpoints/cp-0011.ckpt\n",
      "200/200 [==============================] - 2s 8ms/step - loss: 0.1870 - accuracy: 0.9469 - val_loss: 0.7950 - val_accuracy: 0.7850\n",
      "Epoch 12/30\n",
      "200/200 [==============================] - ETA: 0s - loss: 0.1533 - accuracy: 0.9659\n",
      "Epoch 12: saving model to ../../checkpoints/cp-0012.ckpt\n",
      "200/200 [==============================] - 2s 8ms/step - loss: 0.1533 - accuracy: 0.9659 - val_loss: 0.8565 - val_accuracy: 0.7887\n",
      "Epoch 13/30\n",
      "198/200 [============================>.] - ETA: 0s - loss: 0.1324 - accuracy: 0.9738\n",
      "Epoch 13: saving model to ../../checkpoints/cp-0013.ckpt\n",
      "200/200 [==============================] - 2s 8ms/step - loss: 0.1325 - accuracy: 0.9737 - val_loss: 0.9502 - val_accuracy: 0.7837\n",
      "Epoch 14/30\n",
      "200/200 [==============================] - ETA: 0s - loss: 0.1223 - accuracy: 0.9787\n",
      "Epoch 14: saving model to ../../checkpoints/cp-0014.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.1223 - accuracy: 0.9787 - val_loss: 0.9702 - val_accuracy: 0.7831\n",
      "Epoch 15/30\n",
      "193/200 [===========================>..] - ETA: 0s - loss: 0.1089 - accuracy: 0.9825\n",
      "Epoch 15: saving model to ../../checkpoints/cp-0015.ckpt\n",
      "200/200 [==============================] - 2s 8ms/step - loss: 0.1083 - accuracy: 0.9827 - val_loss: 1.0536 - val_accuracy: 0.7894\n",
      "Epoch 16/30\n",
      "194/200 [============================>.] - ETA: 0s - loss: 0.1048 - accuracy: 0.9823\n",
      "Epoch 16: saving model to ../../checkpoints/cp-0016.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.1052 - accuracy: 0.9820 - val_loss: 1.1376 - val_accuracy: 0.7862\n",
      "Epoch 17/30\n",
      "193/200 [===========================>..] - ETA: 0s - loss: 0.1140 - accuracy: 0.9793\n",
      "Epoch 17: saving model to ../../checkpoints/cp-0017.ckpt\n",
      "200/200 [==============================] - 2s 8ms/step - loss: 0.1140 - accuracy: 0.9794 - val_loss: 1.1758 - val_accuracy: 0.7781\n",
      "Epoch 18/30\n",
      "198/200 [============================>.] - ETA: 0s - loss: 0.1202 - accuracy: 0.9759\n",
      "Epoch 18: saving model to ../../checkpoints/cp-0018.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.1201 - accuracy: 0.9756 - val_loss: 1.1484 - val_accuracy: 0.7719\n",
      "Epoch 19/30\n",
      "198/200 [============================>.] - ETA: 0s - loss: 0.1120 - accuracy: 0.9782\n",
      "Epoch 19: saving model to ../../checkpoints/cp-0019.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.1117 - accuracy: 0.9784 - val_loss: 1.1855 - val_accuracy: 0.7656\n",
      "Epoch 20/30\n",
      "194/200 [============================>.] - ETA: 0s - loss: 0.1068 - accuracy: 0.9797\n",
      "Epoch 20: saving model to ../../checkpoints/cp-0020.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.1064 - accuracy: 0.9798 - val_loss: 1.0902 - val_accuracy: 0.7919\n",
      "Epoch 21/30\n",
      "195/200 [============================>.] - ETA: 0s - loss: 0.1063 - accuracy: 0.9790\n",
      "Epoch 21: saving model to ../../checkpoints/cp-0021.ckpt\n",
      "200/200 [==============================] - 2s 8ms/step - loss: 0.1054 - accuracy: 0.9792 - val_loss: 1.0941 - val_accuracy: 0.7869\n",
      "Epoch 22/30\n",
      "198/200 [============================>.] - ETA: 0s - loss: 0.0944 - accuracy: 0.9826\n",
      "Epoch 22: saving model to ../../checkpoints/cp-0022.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.0943 - accuracy: 0.9828 - val_loss: 1.1063 - val_accuracy: 0.7906\n",
      "Epoch 23/30\n",
      "192/200 [===========================>..] - ETA: 0s - loss: 0.0898 - accuracy: 0.9844\n",
      "Epoch 23: saving model to ../../checkpoints/cp-0023.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.0891 - accuracy: 0.9847 - val_loss: 1.1026 - val_accuracy: 0.7937\n",
      "Epoch 24/30\n",
      "194/200 [============================>.] - ETA: 0s - loss: 0.0828 - accuracy: 0.9889\n",
      "Epoch 24: saving model to ../../checkpoints/cp-0024.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.0821 - accuracy: 0.9892 - val_loss: 1.1456 - val_accuracy: 0.7925\n",
      "Epoch 25/30\n",
      "196/200 [============================>.] - ETA: 0s - loss: 0.0764 - accuracy: 0.9893\n",
      "Epoch 25: saving model to ../../checkpoints/cp-0025.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.0763 - accuracy: 0.9895 - val_loss: 1.2224 - val_accuracy: 0.7894\n",
      "Epoch 26/30\n",
      "193/200 [===========================>..] - ETA: 0s - loss: 0.0733 - accuracy: 0.9909\n",
      "Epoch 26: saving model to ../../checkpoints/cp-0026.ckpt\n",
      "200/200 [==============================] - 2s 8ms/step - loss: 0.0729 - accuracy: 0.9912 - val_loss: 1.3224 - val_accuracy: 0.7775\n",
      "Epoch 27/30\n",
      "197/200 [============================>.] - ETA: 0s - loss: 0.0768 - accuracy: 0.9887\n",
      "Epoch 27: saving model to ../../checkpoints/cp-0027.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.0767 - accuracy: 0.9889 - val_loss: 1.2294 - val_accuracy: 0.7887\n",
      "Epoch 28/30\n",
      "193/200 [===========================>..] - ETA: 0s - loss: 0.0796 - accuracy: 0.9883\n",
      "Epoch 28: saving model to ../../checkpoints/cp-0028.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.0787 - accuracy: 0.9887 - val_loss: 1.2541 - val_accuracy: 0.7812\n",
      "Epoch 29/30\n",
      "198/200 [============================>.] - ETA: 0s - loss: 0.0703 - accuracy: 0.9899\n",
      "Epoch 29: saving model to ../../checkpoints/cp-0029.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.0705 - accuracy: 0.9898 - val_loss: 1.3049 - val_accuracy: 0.7719\n",
      "Epoch 30/30\n",
      "194/200 [============================>.] - ETA: 0s - loss: 0.0795 - accuracy: 0.9861\n",
      "Epoch 30: saving model to ../../checkpoints/cp-0030.ckpt\n",
      "200/200 [==============================] - 1s 7ms/step - loss: 0.0787 - accuracy: 0.9866 - val_loss: 1.3376 - val_accuracy: 0.7850\n"
     ]
    }
   ],
   "source": [
    "epochs = 30\n",
    "checkpoint_path = \"../../checkpoints/cp-{epoch:04d}.ckpt\"\n",
    "checkpoint_dir = os.path.dirname(checkpoint_path)\n",
    "# Create a callback that saves the model's weights\n",
    "cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,\n",
    "                                                 save_weights_only=True,\n",
    "                                                 verbose=1)\n",
    "history = model.fit(\n",
    "    train_ds,\n",
    "    validation_data=val_ds,\n",
    "    epochs=epochs,\n",
    "    callbacks=[cp_callback])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  1/250 [..............................] - ETA: 24s - loss: 1.9588 - accuracy: 0.7188"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "250/250 [==============================] - 1s 4ms/step - loss: 1.5338 - accuracy: 0.7601\n",
      "Loss:  1.5338084697723389\n",
      "Accuracy:  0.7601249814033508\n"
     ]
    }
   ],
   "source": [
    "loss, accuracy = model.evaluate(test_ds)\n",
    "\n",
    "print(\"Loss: \", loss)\n",
    "print(\"Accuracy: \", accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "history_dict = history.history\n",
    "history_dict.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABtSklEQVR4nO3deXiM19sH8O8kkU1WWxaJxFa7UFtDqVbaWBo0dlqhSu1UtahdW7y22qm26GInlNoppUStQRWlQjQSayWSkGXyvH+c30wyEklmfWb5fq5rrsw88yz3jJG5c859zlFIkiSBiIiIyErYyR0AERERkSExuSEiIiKrwuSGiIiIrAqTGyIiIrIqTG6IiIjIqjC5ISIiIqvC5IaIiIisCpMbIiIisipMboiIiMiqMLkhkkGfPn0QHBys07FTpkyBQqEwbEBm5ubNm1AoFFi9erVJr3v48GEoFAocPnxYva24/1bGijk4OBh9+vQx6DmLY/Xq1VAoFLh586bJr02kLyY3RHkoFIpi3fJ++RHp6/jx45gyZQoeP34sdyhEVsFB7gCIzMmPP/6o8fiHH37A/v37822vUaOGXtf55ptvkJOTo9OxEyZMwNixY/W6PhWfPv9WxXX8+HFMnToVffr0gZeXl8ZzV69ehZ0d/w4l0gaTG6I83n33XY3HJ06cwP79+/Ntf156ejpcXV2LfZ0SJUroFB8AODg4wMGB/3VNRZ9/K0NwcnKS9fpEloh/DhBpqWXLlqhduzbOnDmDFi1awNXVFZ999hkA4Oeff0a7du3g7+8PJycnVK5cGZ9//jmUSqXGOZ6v41DVa8yZMwcrVqxA5cqV4eTkhEaNGuHUqVMaxxZUc6NQKDB06FBs27YNtWvXhpOTE2rVqoU9e/bki//w4cNo2LAhnJ2dUblyZXz99dfFruM5evQounTpggoVKsDJyQmBgYH46KOP8PTp03yvz83NDQkJCejYsSPc3NxQtmxZjB49Ot978fjxY/Tp0weenp7w8vJCVFRUsbpnTp8+DYVCge+//z7fc3v37oVCocAvv/wCALh16xYGDx6MatWqwcXFBaVLl0aXLl2KVU9SUM1NcWO+cOEC+vTpg0qVKsHZ2Rm+vr54//338fDhQ/U+U6ZMwSeffAIAqFixorrrUxVbQTU3N27cQJcuXVCqVCm4urrilVdewc6dOzX2UdUPbdy4EV9++SUCAgLg7OyMVq1a4fr160W+7hdZunQpatWqBScnJ/j7+2PIkCH5Xvu1a9fQqVMn+Pr6wtnZGQEBAejevTuSk5PV++zfvx+vvvoqvLy84ObmhmrVqqn/HxHpi3/+Eeng4cOHaNOmDbp37453330XPj4+AEQRppubG0aNGgU3Nzf8+uuvmDRpElJSUjB79uwiz7t27Vo8efIEH374IRQKBWbNmoXIyEjcuHGjyBaE33//HdHR0Rg8eDDc3d2xcOFCdOrUCfHx8ShdujQA4Ny5c2jdujX8/PwwdepUKJVKTJs2DWXLli3W6960aRPS09MxaNAglC5dGidPnsSiRYvw77//YtOmTRr7KpVKhIeHo0mTJpgzZw4OHDiAuXPnonLlyhg0aBAAQJIkdOjQAb///jsGDhyIGjVqYOvWrYiKiioyloYNG6JSpUrYuHFjvv03bNgAb29vhIeHAwBOnTqF48ePo3v37ggICMDNmzexbNkytGzZEn/99ZdWrW7axLx//37cuHEDffv2ha+vLy5duoQVK1bg0qVLOHHiBBQKBSIjI/H3339j3bp1+Oqrr1CmTBkAeOG/yd27d9G0aVOkp6dj+PDhKF26NL7//nu0b98emzdvxjvvvKOx/8yZM2FnZ4fRo0cjOTkZs2bNQq9evfDHH38U+zWrTJkyBVOnTkVYWBgGDRqEq1evYtmyZTh16hSOHTuGEiVKIDMzE+Hh4cjIyMCwYcPg6+uLhIQE/PLLL3j8+DE8PT1x6dIlvP3226hbty6mTZsGJycnXL9+HceOHdM6JqICSUT0QkOGDJGe/2/y2muvSQCk5cuX59s/PT0937YPP/xQcnV1lZ49e6beFhUVJQUFBakfx8XFSQCk0qVLS48ePVJv//nnnyUA0o4dO9TbJk+enC8mAJKjo6N0/fp19bbz589LAKRFixapt0VEREiurq5SQkKCetu1a9ckBweHfOcsSEGvb8aMGZJCoZBu3bql8foASNOmTdPYt379+lKDBg3Uj7dt2yYBkGbNmqXelp2dLTVv3lwCIK1atarQeMaNGyeVKFFC4z3LyMiQvLy8pPfff7/QuGNiYiQA0g8//KDedujQIQmAdOjQIY3XkvffSpuYC7ruunXrJADSkSNH1Ntmz54tAZDi4uLy7R8UFCRFRUWpH48cOVICIB09elS97cmTJ1LFihWl4OBgSalUaryWGjVqSBkZGep9FyxYIAGQLl68mO9aea1atUojpnv37kmOjo7SW2+9pb6GJEnS4sWLJQDSypUrJUmSpHPnzkkApE2bNr3w3F999ZUEQLp//36hMRDpit1SRDpwcnJC37598213cXFR33/y5AkePHiA5s2bIz09HVeuXCnyvN26dYO3t7f6cfPmzQGIboiihIWFoXLlyurHdevWhYeHh/pYpVKJAwcOoGPHjvD391fvV6VKFbRp06bI8wOary8tLQ0PHjxA06ZNIUkSzp07l2//gQMHajxu3ry5xmvZtWsXHBwc1C05AGBvb49hw4YVK55u3bohKysL0dHR6m379u3D48eP0a1btwLjzsrKwsOHD1GlShV4eXnh7NmzxbqWLjHnve6zZ8/w4MEDvPLKKwCg9XXzXr9x48Z49dVX1dvc3NwwYMAA3Lx5E3/99ZfG/n379oWjo6P6sTafqbwOHDiAzMxMjBw5UqPAuX///vDw8FB3i3l6egIQXYPp6ekFnktVNP3zzz8bvVibbBOTGyIdlC9fXuMLQ+XSpUt455134OnpCQ8PD5QtW1ZdjJy33uBFKlSooPFYlej8999/Wh+rOl517L179/D06VNUqVIl334FbStIfHw8+vTpg1KlSqnraF577TUA+V+fs7Nzvq6VvPEAohbGz88Pbm5uGvtVq1atWPGEhISgevXq2LBhg3rbhg0bUKZMGbzxxhvqbU+fPsWkSZMQGBgIJycnlClTBmXLlsXjx4+L9e+SlzYxP3r0CCNGjICPjw9cXFxQtmxZVKxYEUDxPg8vun5B11KN4Lt165bGdn0+U89fF8j/Oh0dHVGpUiX18xUrVsSoUaPw7bffokyZMggPD8eSJUs0Xm+3bt3QrFkzfPDBB/Dx8UH37t2xceNGJjpkMKy5IdJB3r/IVR4/fozXXnsNHh4emDZtGipXrgxnZ2ecPXsWY8aMKdYvbnt7+wK3S5Jk1GOLQ6lU4s0338SjR48wZswYVK9eHSVLlkRCQgL69OmT7/W9KB5D69atG7788ks8ePAA7u7u2L59O3r06KExomzYsGFYtWoVRo4cidDQUHh6ekKhUKB79+5G/ULt2rUrjh8/jk8++QT16tWDm5sbcnJy0Lp1a5N9kRv7c1GQuXPnok+fPvj555+xb98+DB8+HDNmzMCJEycQEBAAFxcXHDlyBIcOHcLOnTuxZ88ebNiwAW+88Qb27dtnss8OWS8mN0QGcvjwYTx8+BDR0dFo0aKFentcXJyMUeUqV64cnJ2dCxwpU5zRMxcvXsTff/+N77//Hr1791Zv379/v84xBQUF4eDBg0hNTdVoCbl69Wqxz9GtWzdMnToVW7ZsgY+PD1JSUtC9e3eNfTZv3oyoqCjMnTtXve3Zs2c6TZpX3Jj/++8/HDx4EFOnTsWkSZPU269du5bvnNrMOB0UFFTg+6Pq9gwKCir2ubShOu/Vq1dRqVIl9fbMzEzExcUhLCxMY/86deqgTp06mDBhAo4fP45mzZph+fLl+OKLLwAAdnZ2aNWqFVq1aoV58+Zh+vTpGD9+PA4dOpTvXETaYrcUkYGo/trM+xdxZmYmli5dKldIGuzt7REWFoZt27bhzp076u3Xr1/H7t27i3U8oPn6JEnCggULdI6pbdu2yM7OxrJly9TblEolFi1aVOxz1KhRA3Xq1MGGDRuwYcMG+Pn5aSSXqtifb6lYtGhRvmHphoy5oPcLAObPn5/vnCVLlgSAYiVbbdu2xcmTJxETE6PelpaWhhUrViA4OBg1a9Ys7kvRSlhYGBwdHbFw4UKN1/Tdd98hOTkZ7dq1AwCkpKQgOztb49g6derAzs4OGRkZAER33fPq1asHAOp9iPTBlhsiA2natCm8vb0RFRWF4cOHQ6FQ4McffzRq87+2pkyZgn379qFZs2YYNGgQlEolFi9ejNq1ayM2NrbQY6tXr47KlStj9OjRSEhIgIeHB7Zs2aJ17UZeERERaNasGcaOHYubN2+iZs2aiI6O1roepVu3bpg0aRKcnZ3Rr1+/fDP6vv322/jxxx/h6emJmjVrIiYmBgcOHFAPkTdGzB4eHmjRogVmzZqFrKwslC9fHvv27SuwJa9BgwYAgPHjx6N79+4oUaIEIiIi1ElPXmPHjsW6devQpk0bDB8+HKVKlcL333+PuLg4bNmyxWizGZctWxbjxo3D1KlT0bp1a7Rv3x5Xr17F0qVL0ahRI3Vt2a+//oqhQ4eiS5cueOmll5CdnY0ff/wR9vb26NSpEwBg2rRpOHLkCNq1a4egoCDcu3cPS5cuRUBAgEahNJGumNwQGUjp0qXxyy+/4OOPP8aECRPg7e2Nd999F61atVLPtyK3Bg0aYPfu3Rg9ejQmTpyIwMBATJs2DZcvXy5yNFeJEiWwY8cOdf2Es7Mz3nnnHQwdOhQhISE6xWNnZ4ft27dj5MiR+Omnn6BQKNC+fXvMnTsX9evXL/Z5unXrhgkTJiA9PV1jlJTKggULYG9vjzVr1uDZs2do1qwZDhw4oNO/izYxr127FsOGDcOSJUsgSRLeeust7N69W2O0GgA0atQIn3/+OZYvX449e/YgJycHcXFxBSY3Pj4+OH78OMaMGYNFixbh2bNnqFu3Lnbs2KFuPTGWKVOmoGzZsli8eDE++ugjlCpVCgMGDMD06dPV8zCFhIQgPDwcO3bsQEJCAlxdXRESEoLdu3erR4q1b98eN2/exMqVK/HgwQOUKVMGr732GqZOnaoebUWkD4VkTn9WEpEsOnbsiEuXLhVYD0JEZGlYc0NkY55fKuHatWvYtWsXWrZsKU9AREQGxpYbIhvj5+enXu/o1q1bWLZsGTIyMnDu3DlUrVpV7vCIiPTGmhsiG9O6dWusW7cOSUlJcHJyQmhoKKZPn87EhoisBltuiIiIyKrIWnNz5MgRREREwN/fHwqFAtu2bSv2sceOHYODg4N6bgQiIiIiQObkJi0tDSEhIViyZIlWxz1+/Bi9e/dGq1atjBQZERERWSqz6ZZSKBTYunUrOnbsWOS+3bt3R9WqVWFvb49t27YVOflYXjk5Obhz5w7c3d21mvKciIiI5CNJEp48eQJ/f/8iJ6u0uILiVatW4caNG/jpp5/Ua5QUJiMjQ2M674SEBKNNT05ERETGdfv2bQQEBBS6j0UlN9euXcPYsWNx9OhRjRV/CzNjxgxMnTo13/bbt2/Dw8PD0CESERGREaSkpCAwMBDu7u5F7msxyY1SqUTPnj0xdepUvPTSS8U+bty4cRg1apT6serN8fDwYHJDRERkYYpTUmIxyc2TJ09w+vRpnDt3DkOHDgUg6mckSYKDgwP27duHN954I99xTk5OcHJyMnW4REREJBOLSW48PDxw8eJFjW1Lly7Fr7/+is2bN6NixYoyRUZERETmRNbkJjU1FdevX1c/jouLQ2xsLEqVKoUKFSpg3LhxSEhIwA8//AA7OzvUrl1b4/hy5crB2dk533YiIiKyXbImN6dPn8brr7+ufqyqjYmKisLq1auRmJiI+Ph4ucIjIiIiC2Q289yYSkpKCjw9PZGcnMyCYiIiIguhzfe3rDMUExERERkakxsiIiKyKkxuiIiIyKowuSEiIiKrYjHz3Jg7pRI4ehRITAT8/IDmzQF7e7mjIiIisj1MbgwgOhoYMQL499/cbQEBwIIFQGSkfHERERHZInZL6Sk6GujcWTOxAYCEBLE9OlqeuIiIiGwVkxs9KJWixaagmYJU20aOFPsRERHZCrln0GNyo4ejR/O32OQlScDt22I/IiIia3flCtC+vSjLkBOTGz0kJhp2PyIiIkt0/z4wZAhQuzawYwcwYwaQkSFfPExu9ODnZ9j9iIiILMmzZ8DMmUDlysDSpaIMo3174MgRwMlJvrg4WkoPzZuLUVEJCQX3LyoU4vnmzU0fGxERkbHk5ADr1wPjxgGq9a1ffhmYOxdo2VLW0ACw5UYv9va5/YoKheZzqsfz53O+GyIiW5OQAHz0EXD9utyRGN7Ro8ArrwC9eonEJiAA+OEH4NQp80hsACY3eouMBDZvBsqX19weECC2c54bIiLbIklAnz7ij9vOnYGsLLkjMoxr18R3WosWIpFxcwO+/BK4ehV47z3AzowyCoUkyT1gy7S0WTJdG5yhmIiIAGDrVs0/bP/v/4BPP5UvHn09fAhMmyZqarKzRRLTvz8wdSrg42O6OLT5/mZyQ0REZCBPnwI1awI3bwKNGwMnTwIuLsCffwKVKskdnXYyMoDFi4EvvgAePxbb2rYFZs8Wr9HUtPn+NqNGJCIiIss2e7ZIbAICgF9/Bd54QyQ8gwbJP7FdcUkSsHEjUKMGMHq0SGzq1gX27wd27pQnsdEWkxsiIiIDuHVLzO8CAHPmACVLAsuXiyHR+/YBa9fKG19xJCcDbdoA3boBcXGizGLlSuDsWSAsTO7oio/JDRERkQGMHi3mfXntNaBrV7GtalVg0iRxf+RIUb9irm7dApo1A/buFV1pU6aIIuK+fS2vhpTJDRERkZ5+/VWMkLWzAxYu1JweZPRoMXPvgwfivjk6c0YM7750CfD3B44dAyZPFq1PlojJDRERkR6ys4Hhw8X9wYNFfUpejo7AihUi4Vm9WiRC5mTHDjG8OylJxP7HH0D9+nJHpR8mN0RERHpYulS0eJQuLYZHFyQ0VBQVA8CHH4oiY3OwaBHQsSOQng6Eh4spTQIC5I5Kf0xuiIiIdHT/fm5NzZdfAqVKvXjf6dNFl8/162JfOSmVYgbl4cPFUgr9+4sWHGuZIYXJDZEMnjwRfy398IPckRCRPj77TIwwql8f+OCDwvf19BTzxgBiYr8//zR+fAVJSwM6dRIzKANi4cuvvwZKlJAnHmNgckMkg+3bgZ9/zh02SkSW5/Rp4LvvxP1Fi4o3ouidd8QfNtnZwIABotXElJKSxPpPP/8shqivXw+MGZN/fURLx+SGSAbnzomft25ZzsReRJQrJ0d06UgS8O67Ygh1cS1aBLi7AzExosXEVP76S4yIOn1a1AcdPCjms7FGTG6IZHD2rPj59KkYHkpEluWnn0Ry4uYmupi0ERAg6m8AYOxYsYK4sf36K9C0qfiDqmpV4MQJ7RIyS8PkhsjEJCk3uQHELxsishwpKaIrBwAmThRFwtoaNAho0kScSzWM3Fi+/16MhEpOBl59VSRlVaoY95pyY3JDZGJxceKXjAqTGyLL8vnnonalalVgxAjdzmFvL+a+cXAAoqNFDYyhSZIYydWnj6jx6d5drA9VurThr2VumNwQmZiq3kaFyQ2R5bhyJXeU0fz5oihXV3XrAp98Iu4PGSJacQwlIwPo3VskYoAY1bVmDeDsbLhrmDMmN0QmlrdLCgDi4+WJg4i0I0lifajsbODtt4G2bfU/58SJQOXKou5mwgT9zweICQXDw0VdkL098O23Yl4dOxv6xrehl0pkHlTJTZ064idbbogsw44dYlFJR0fgq68Mc04XF7FyOCDmwPnjD93Ok5Ul1rZq2VKsY/Xbb2JE1q5dQL9+honVkjC5ITKhvMXEHTuKn0xuiMzfs2diRl8A+PhjwxbkhoWJLiRJEnPfZGUV/9ikJNH1FBwMdOkikhp7eyAyUoyIeustw8VpSZjcEJlQYiJw75745fP222Ibkxsi8zd3LnDjBlC+vKhfMcb5S5cGLlwA5s0rfF9JEqt29+gBVKggiobv3AHKlRNdWzdvAlu2ADVrGj5OS8HkhsiEVK02NWoA1auL+48eAamp8sVERIW7fTt3XprZs8XcNoZWpkxuV9eUKcA//+TfJz1d1M/Ury+GdK9fL1p5mjYVxcLx8aIVxxoWvtQXkxsiE1IlNy+/LBao8/ISj9l6Q2S+Pv1UJBavviqGUxvLu+8CrVqJLrCBA3NnL79+HRg1SrQa9e8PnD8vRj316yd+pxw7BvTsqd/ILWvjIHcARLZEldzUry9+BgUBjx+L5KZWLdnCIqIX+O030UJiZyeWTTDmGkwKhSgurlMHOHBATBR48SKwZ0/uPpUqAYMHA337Fr4Cua1jyw2RCanmuHn5ZfEzKEj8ZMsNkfnJzs6dPfjDD4F69Yx/zSpVgMmTxf3Zs0Vio1CIYec7dwLXromCZiY2hWPLDZGJPHiQO6eN6pckkxsi8/X116LAt1Sp3MnwTOHjj8UQ7r/+ErMLDxok5sKh4mNyQ2QiqlabqlVFvQ3A5IbIXMXH506q98UXpl2yoEQJ0R1mzC4wa8duKSITeb7eBshNbjhLMZH5yMwUc8Y8fgw0aiTmnjE1Jjb6YXJDZCLP19sAbLkhMkejRwMnTwLe3sDGjWJeKrIssiY3R44cQUREBPz9/aFQKLBt27ZC94+Ojsabb76JsmXLwsPDA6Ghodi7d69pgiXSU95h4CoVKoifd+6IvxaJSF4bNohRUQDw449i5l+yPLImN2lpaQgJCcGSJUuKtf+RI0fw5ptvYteuXThz5gxef/11RERE4NzzyywTmZmUFDHKAdDslipXTsxXIUnAv//KExsRCVeuAB98IO5/9hnQrp288ZDuZC0obtOmDdq0aVPs/eer1pn/n+nTp+Pnn3/Gjh07UD/vNwaRmYmNFT8DA8VMpCoKhWi9+ftv0TVVqZIs4RHZvLQ0oHNnMVt4y5bA1KlyR0T6sOjRUjk5OXjy5AlKFTLgPyMjAxkZGerHKSkppgiNSENB9TYqQUG5yQ0RmZ4kieHWly4Bvr7AunWAg0V/O5JFFxTPmTMHqamp6Nq16wv3mTFjBjw9PdW3wMBAE0ZIJBRUb6PComIieX37raivsbcXNTe+vnJHRPqy2ORm7dq1mDp1KjZu3Ihy5cq9cL9x48YhOTlZfbt9+7YJoyQSmNwQmaezZ4Fhw8T96dOBFi3kjYcMwyIb3tavX48PPvgAmzZtQlhYWKH7Ojk5wYmriZGMnj4FLl8W9wsqDWNyQ0XJzAT27gVCQzVrtkg///0n6mwyMoCICDEEnKyDxbXcrFu3Dn379sW6devQjqXsZAEuXgSUSjEyyt8///NMbqgwMTFAgwZA+/bAG28AWVlyR2QdJEksPhkXJ4Z7f/+9WByTrIOs/5SpqamIjY1F7P+GksTFxSE2Nhbx/5uuddy4cejdu7d6/7Vr16J3796YO3cumjRpgqSkJCQlJSE5OVmO8ImKJW+XVEGzjqqSm9u3gZwc08VF5i05GRgyBGjWDPjzT7Ht4kVgwQJ547IWc+cCP/8MODoCmzeLCfvIesia3Jw+fRr169dXD+MeNWoU6tevj0mTJgEAEhMT1YkOAKxYsQLZ2dkYMmQI/Pz81LcRI0bIEj9RcRS07EJe5cuLvxgzM4G7d00XF2ln2zbgtdfEekP37hn3Wlu3AjVrAkuXihaGPn3ElzEgVozmch36OXoUGDtW3F+4ULSMkXVRSJIkyR2EKaWkpMDT0xPJycnwUK1eSGREDRsCZ84AmzaJ/v2CVKggWm5iYoBXXjFtfFS4u3dFwemmTbnbnJ2B998Xqzcbcm6ihARg6FCRSAFAlSpiZeo33hCteq+9Bvz+O9Cxo0iASHt374o/NBITgV69xCgpruNkGbT5/mYPI5ERZWWJrgSg4JFSKqy7MT+SJL74atYUiY29PTB4MNC4MfDsmWhVqVoV6NkTOH9ev2splcCSJUCNGiKxcXAAxo8HLlwQiQ0gWveWLRPPbdsGbN+u7yu0PUol0KOHSGxq1gSWL2diY62Y3BAZ0V9/ie4mT0+gYsUX78fkxrzEx4up93v3Bh49AurVEwspLlkCnDgB/PorEB4uWlPWrRPPt24NHD4skiJtXLwIvPqqaLF58kS03J07B3zxBeDiorlv7dqitQgQrUlpaQZ4sTZk8mTg0CGgZElRZ+PmJndEZCxMboiMKG+9TWF/ITK5MQ85OaJFplYtYPduwMlJzH1y8mRuy5tCAbz+OrBnj/j37d5dtKrs3Su2v/IKEB1ddHH406eidebll0XC5O4ukqdjx0QS8yITJ4rPS3w88Pnnhnvt1m73buDLL8X9b78VrWRkvZjcEBlRYZP35cXkRn5//y3WFBoyRKwv1LSpWBNs3DigRImCj6lfX7TcXLsmuqycnUUi1KmT+PL87jsxh8rzDh4E6tYViVN2NvDOO2IupMGDix6OXLJk7qrVc+fmjqSiF7t1C3j3XXF/8GCRkJJ1Y3JDZESFrSmVF5Mb+WRnA7NmASEhYhRNyZJiBM3Ro0D16sU7R6VKotXl1i3RGuPlJZKlDz4Qz82ZI1aGf/BAjHwKCwOuXxfzHkVHi1v58sWPOSJCFBVnZ4s1kTiFwItlZABdu4ruxYYNgXnz5I6ITIGjpYiMRKkUtTZpaaL2prBm8CtXxPPu7mJ+ExY5msb582LUk6qF7c03gRUrxKRu+njyRJznq6/ECChAfBYcHICHD8W/7+DBouVG119D8fHiM5OeDqxcKSako/yGDQMWLxbz2Jw9q/+/LcmHo6WIzMC1ayKxcXUFXnqp8H0rVBA/nzwBHj82emg2LyND1K40bCi+8Ly8gFWrRN2MIb783N1F4e+NGyLxqFZNJK0PH4p6muPHxReuPn9fVagATJ0q7n/yiTg35ZIk0QK3eLF4/OOPTGxsCZMbIiNRtQaEhIhhxIVxdQXKlhX32TVlXDExolbmiy9Et05kpKh36dPH8C1mjo6iReWvv8TQ7W+/FZ8LQ81lNGKESJYePgTGjDHMOa3Bf/8BXbqI9wcAPvtMjH4j28HkhshIiltvo6Kqu+Hss8YzYYJYzuDyZcDHRwwH3rIF8PU17nXt7ESdTL9+Ly5O1kWJEmKuFkAUL//+u+HObamOHxdD87dsEe/P3LkcVWaLmNwQGUlxR0qpqLqm2HJjHOvXi6HAkgRERYnWlE6d5I5Kf82aicJlQBQX2+rCmkqlqGFq0UL8gVC5skh0Ro3igpi2iP/kREYgSUWvKfU8jpgyntu3xRc/IGptVq8GSpWSNSSDmjkTKFNGDAufP1/uaEwvMVFMqjh+vEhyevYU//8aNpQ7MpILkxsiI7h5UxQGlyghJoQrDiY3xpGTI+ppHj8GGjUSyY21KV0amD1b3J8yxbY+Q7t3i7q2gwdF7dqqVcBPP+lXrE2Wj8kNkRGo6m3q1BFFpcXB5MY4FiwQyyW4uoovPUPWvJiTqCjRJZOeDgwfLnc0xpeZCYweDbRtC9y/LxKcM2eMUxhOlofJDZERaFtvAzC5MYY//xQzDAOisLSoIfmWTKEQS0c4OIiRWT//LHdExvPPP6LWaO5c8XjoULGERXEnXSTrx+SGyAi0rbcBcpObe/fEukOkn4wMoFcv8bNdO+DDD+WOyPhq1RKtGYBovbHGhTXXrRP/r06fFhPzbdsmlqNwdpY7MjInTG6IjECXlhtv79xVijkcXH8TJwIXLohC22+/tZ2uirwLa06bJnc0hpOWJobS9+wpJrt89VUxw3SHDnJHRubIQe4AiKxNYiJw964Yflq3bvGPUyjEl9KlS6Jrqlo148Vo7X77TaznBIjExtjz2JgTV1cxK29EhFhH6d13Re2XHB4+BE6dEjM1u7uLmaBVN29v8bNkyaITz/PnxWKXV66IfSdOFDcHfoPRC/CjQWRgqlabGjXEF4028iY3pJvkZKB3bzEcv18/2/zL/u23xUrjW7eKIfBHjhh/rpe0NPHZP3lSJDSqpKYo9vYFJz2qW06OWJQ0I0MsNPrTT8DrrxvzlZA1YHJjIBcvAv/3f2L44dKlckdDctKl3kaFsxTrb9gw8f5VqiQWrrRVCxYA+/YBx46JeX3ef99w587MFL/zVEnMyZNiUsSCVievWlUk+k+fiuH4jx+L5REePxbLXyiVooWnqLWx2rUTr6NMGcO9DrJeTG4MJD0dWLNG/GXB5Ma26VJvo8JZivWzaZNYINHOTvyF7+4ud0TyCQwUC2uOHi0W1mzfXrvEQJLE77X//hOJx4ULuYlMbKxoSXle+fJiLqFGjYDGjYEGDURLTGHnVyU8zyc+eW9Nm4o1umylbor0x+TGQKpWFT/v3AFSU3MLQ8n2aLumVF4cDq67hITcEVGffQaEhsobjzkYPhz44QeRmAwfLt6f//4r/q2wpRy8vHKTGFVC4+9f/NgUClFvU7KkSIqIDEkhSZIkdxCmlJKSAk9PTyQnJ8PDwFNYlikj/sI5d04s3Ea25+HD3L+OHz8GPD21O/74cTF/R1CQmOWYiicnB2jdGti/X0y5f/y49U7Wpy3VZ0pXDg6i9aVqVc1EpkoVtqSQaWnz/c2WGwOqWlV8uV27xuTGVqlabSpX1j6xAXJbbv79V9QjcDRI8SxeLBIbFxfrnoVYF02bipFF33wjagK9vQu+lSpV8PbijGYiMjf81WlAL70kZsn8+2+5IyG56FNvAwB+fuKLOStLdHGqanDoxf76CxgzRtyfM4dD6AsybZp1zXlDVBRO4mdAqrqba9fkjYPko0+9DSAKYQMDxX3W3RQtM1PMQvzsGdCmTe7K30Rk25jcGJBq3Rq23NgufVtuABYVa2PyZDFyp3Rp4Lvv2H1CRAKTGwNiy41tS0nJTWx1meNGhclN8Rw9KuaWAkQ9iZ+fvPEQkflgcmNAquTmwQMxjJJsy/nz4mdAAFC2rO7nYXJTtJQU4L33xFwpffuK2XiJiFSY3BiQm1vuX49svbE9+tbbqDC5Kdrw4eL9qVhRzMRLRJQXkxsDU9XdMLmxPYaotwFyR0hxCYaCbdkCfP+9KL7+8UfbnoWYiArG5MbAVF1TLCq2PfqsKZVX3pYb25pis2iJibmzEI8dq9/kdERkvZjcGBiLim3T06divhVA/5Yb1VDwp09F/RYJOTmivubhQ/EeT54sd0REZK6Y3BgYh4Pbpj//FKsbly2r/zo5Tk65tVusu8m1ZAmwdy/g7CxmIXZ0lDsiIjJXTG4MLG/LDbsUbEfeehtDzLXComJNly4Bn34q7s+ZA9SoIW88RGTemNwYWOXK4sstJQW4d0/uaMhUDFVvo8LkJldGBvDuu7mzEA8eLHdERGTumNwYmLNz7mgX1t3YDkONlFJhcpNr0iQxC3GZMsDKlZyFmIiKxuTGCFh3Y1uysoCLF8V9JjeGdfgwMHu2uP/tt4Cvr6zhEJGFYHJjBBwxZVsuXxZdJ56eQKVKhjknkxsxy7dqFuL+/YEOHeSOiIgsBZMbI+BEfrZF1SVVr57hukyY3ABDhgD//gtUqQLMmyd3NERkSZjcGAEn8rMthq63AXLrtv77D3jyxHDntRRr1wLr1gH29mLYt5ub3BERkSVhcmMEquTm+nUx8RhZN0OtKZWXhwfg5SXu29oyDLdu5Y6ImjQJaNJE3niIyPLImtwcOXIEERER8Pf3h0KhwLZt24o85vDhw3j55Zfh5OSEKlWqYPXq1UaPU1vBwYCDg5hhNiFB7mjImHJyjJPcALbZNaVUAlFRQHIy8MorwGefyR0REVkiWZObtLQ0hISEYMmSJcXaPy4uDu3atcPrr7+O2NhYjBw5Eh988AH27t1r5Ei1U6KEWK0YYN2Ntbt2DUhLA1xcgGrVDHtuW0xu5swBfvsNKFlSdEc5OMgdERFZIll/dbRp0wZt2rQp9v7Lly9HxYoVMXfuXABAjRo18Pvvv+Orr75CeHi4scLUyUsviS++v/8G3nhD7mjIWFT1NiEhoj7EkGwtuTl7Fpg4UdxfuFBMiElEpAuLqrmJiYlBWFiYxrbw8HDExMTIFNGLcTi4bTBWlxRgW8lNejrQq5eYMygyUiyQSUSkK4tq9E1KSoKPj4/GNh8fH6SkpODp06dwcXHJd0xGRgYyMjLUj1NSUoweJ8CJ/GyFMUZKqdhScjNmDHDlilgw9OuvOQsxEenHolpudDFjxgx4enqqb4GBgSa5LlturJ8kGX5NqbxsJbnZvRtYvFjcX7VKLLNARKQPi0pufH19cffuXY1td+/ehYeHR4GtNgAwbtw4JCcnq2+3b982RajqlpsbN4DsbJNckkzs1i0xD02JEkCtWoY/vyq5SUwEMjMNf35zcP9+bhfU8OGAmZXOEZGFsqjkJjQ0FAcPHtTYtn//foSGhr7wGCcnJ3h4eGjcTCEgQCyimZVl/X952ypVvU3t2oCTk+HPX7as+AxJEmCinNykVMsq3L0L1KwJzJwpd0REZC1kTW5SU1MRGxuL2NhYAGKod2xsLOL/N2vZuHHj0Lt3b/X+AwcOxI0bN/Dpp5/iypUrWLp0KTZu3IiPPvpIjvALZWeXO9qDXVPWyZj1NoCoO1HNVGyNE/l99x3w88+i5WvNGjGcnojIEGRNbk6fPo369euj/v8KFkaNGoX69etj0qRJAIDExER1ogMAFStWxM6dO7F//36EhIRg7ty5+Pbbb81uGLgKi4qtmzHrbVSste7m2jVgxAhx/8svxbpcRESGIutoqZYtW0KSpBc+X9Dswy1btsQ5VX+AmWNRsfV6+BD49Vdx/5VXjHcda0xusrKAd98Vw79btgRGjZI7IiKyNhZVc2Np2HJjvVasAJ49E602xuqWAqwvucnKAiZMAE6eBDw9ge+/N/zkh0REFjXPjaVhy411ysoCVCuGjBxp3DlZrCG5USqBw4eBDRuALVuAR4/E9uXLc2uKiIgMicmNEalabm7dAjIyjDOihkwvOlosiOrjA3TrZtxrWWpyk5MDHDsmEppNm4B793KfK1cO+OgjoHt3+eIjIuvG5MaIfHwANzcgNVXMd1OjhtwRkSHMny9+Dhxo/IRVldzcvi0SBjsz7kiWJNHdtGEDsHGjSABVSpUCOnUSyeBrr3FBTCIyLv6KMSKFQrTenD0r6m6Y3Fi+kyeBEycAR0eR3Bhb+fKiJiUzE0hKAvz9jX9NbUgSEBsLrF8vEpqbN3Of8/AA3nlHtNC0aiWGfBMRmQKTGyOrWlUkN6y7sQ4LFoif3bsDvr7Gv56Dg0hw4uNF15S5JDeXLomEZsMGzc92yZJA+/bi/QkPZ1csEcmDyY2RsajYeiQkiNYJIHeOFlMICspNbgqZjNtkvvxSjHhScXYG3n5bdDm1bQu4usoXGxERwOTG6Dgc3HosWybWCWve3LjDv5+nGlFkDkXFFy4AkyeL+2+/DfToAUREAO7u8sZFRJQXkxsjY8uNdXj6FPj6a3HflK02QG5RsdxLMOTkAAMGiKHdkZFiWDcRkTky47EX1kHVcpOQAKSlyRsL6W7tWuDBA9GK0qGDaa9tLsPBly8H/vhDtNIsXChvLEREhWFyY2SlSokbAFy/Lm8spBtJyi0kHjbM9MOYzSG5uXMHGDdO3J8+XRQ5ExGZKyY3JsC6G8t2+DBw8aIolO3Xz/TXz5vcFLIUm1GNGAGkpACNGwODBskTAxFRcTG5MQHW3Vg21aR9ffoA3t6mv76qoPjJE+DxY9Nf/5dfgM2bxXw7K1ZwLSgiMn9MbkxAldyw5cby/PMPsGOHuD98uDwxuLoCZcuK+6bumkpNBYYMEfdHjQJCQkx7fSIiXTC5MQFVtxRbbizPokWiK6h1a6BaNfnikKvuZsoUMUorKCh3CDgRkbljcmMC7JayTCkpwMqV4v7IkbKGIktyc+5cbpfcsmVi9mEiIkvA5MYEVMnN/fvy1EyQblavFnUu1asDb70lbyymTm6Uytw5bbp2Bdq0Mc11iYgMgcmNCbi7565DxNYby6BU5s7lMny4WARVTqaepXjJEuD0acDTM7f1hojIUjC5MREOB7csu3aJYmIvL6B3b7mjMe0sxf/+C4wfL+7PnAn4+Rn/mkREhsTkxkRYd2NZVJP29e9vHrUmpuyWGjZMjJIKDRVdU0RElobJjYmw5cZyXLwIHDwI2NnlDoOWmyq5uXdPrHNlLNu2iZuDg1hLy46/IYjIAvFXl4mw5cZyqGptIiNzkwq5eXsDbm7ivrG6pp48Ea02ADB6NFCnjnGuQ0RkbExuTCTvRH5yTaFPRXvwAPjpJ3Hf1Kt/F0ahMH7X1MSJot6mUiVxn4jIUjG5MZHKlcUXVEqKGBJO5mnFCuDZM+Dll4FmzeSORpMxk5vTp8WEhYCY08bV1fDXICIyFSY3JuLiAgQGivvsmjJPWVnA0qXi/siR8g//fp6xkpvsbFE4nJMD9Owp/5w+RET6YnJjQiwqNm9btgAJCYCPj5i4ztwYK7lZtEjMRuzlBcybZ9hzExHJgcmNCbGo2LypJqsbPBhwcpI1lAIZI7mJj8+tr5k9WyR2RESWjsmNCbHlxnz98Ye4OToCH34odzQFM/QsxZIkhrqnpQGvvgq8/75hzktEJDcmNybElhvzpZq0r0cP8229ULXcJCSIOhl9RUcDv/wClCjBOW2IyLo4yB2ALVG13Fy7Joo3VV8mSiVw9CiQmCimum/eHLC3ly9OW5OQAGzaJO6b0/Dv5/n5iUQkKwu4cye3JUcXycm5c9qMGQPUrGmYGImIzAH/VjOh4GCRtDx9Kr6cAPHXc3Aw8PrrYqTK66+Lx9HRMgZqY5YuFS0hLVoA9evLHc2L2dnljrjTt2tq/HiRTFepkruOFBGRtWByY0IlSgAVK4r7f/8tEpjOncXEaXklJIjtTHCM7+lT0SUDmHerjYohioo3bMgd8r58OeDsrH9cRETmhMmNiam6pq5eFV+mBc1WrNo2cqTosiLjWbMGePhQtJZ16CB3NEXTN7nZvh14913xGRs6FGjVynCxERGZCyY3JqYqKj50KH+LTV6SBNy+LWpxyDgkKbeQeOhQy6hz0ie52b8f6NJFdMG9917uaycisjYsKDYxVcvNP/8Ub//EROPFYkskSSST58+LW2ysuF2/DpQsCfTrJ3eExaNrcnP0qGiZyswEOnUCVq7k6Cgisl5MbkxM1XLz4EHx9vfzM14s1iojA7h0KTeRUd3++6/g/UePFrPzWgJdkptTp4B27UR9UZs2wNq1gAP/5xORFeOvOBNTtdwkJgLly4tRUwXV3SgUQECAGBZOL/bsGXDkiGYSc/lywbVKDg5A9epASIjmzVzntSmIKrmJjxefm6LWv7pwAQgPB548ESPxtmwRExUSEVkzJjcmFhgopvbPyAA++0zUeigUmgmO6gtr/nzLqAORS3a2SP5On87/XKlS+ZOYmjXNc1kFbQQEiJ9Pn4rV5cuVe/G+V68Cb74pWqxCQ0UxsYuLaeIkIpITkxsTs7MTc4tcugRUqgRs3ixGTeUtLg4IEIlNZKRsYVqENWtEYuPmJrpb6tXLTWTKlze/Vb0NwclJdFUmJoquqRclN3FxYiTUvXti7p5du8T7RERkC5jcyKBqVZHcXLsmZont0IEzFGsrOxv4/HNxf/JkUTdjK4KCxGclPh5o1Cj/8//+KxKbhATRWrVvn+XUFBERGQKTGxmoiopVC2ja2wMtW8oWjkX66Scx4qxsWWDQILmjMa2gIODEiYKLiu/dA8LCRMtN5crAgQNAmTKmj5GISE4cDCqDvGtMkfays4EvvhD3P/1UDOW2JS8aMfXokaixuXpV1HYdPMjRdkRkm2RPbpYsWYLg4GA4OzujSZMmOHnyZKH7z58/H9WqVYOLiwsCAwPx0Ucf4dmzZyaK1jCeb7kh7dhyqw1QcHKTkgK0bi1GR/n6isRGtR8Rka2RNbnZsGEDRo0ahcmTJ+Ps2bMICQlBeHg47t27V+D+a9euxdixYzF58mRcvnwZ3333HTZs2IDPPvvMxJHrR9Vyc+uWmFSNis/WW22A/MlNejrw9ttiPpvSpcVMxKoEmojIFsma3MybNw/9+/dH3759UbNmTSxfvhyurq5YuXJlgfsfP34czZo1Q8+ePREcHIy33noLPXr0KLK1x9z4+oqRKzk5wI0bckdjWX78UbTalCtnm602gGZyk5EBvPOOKEj38AD27gVq15Y3PiIiucmW3GRmZuLMmTMICwvLDcbODmFhYYiJiSnwmKZNm+LMmTPqZObGjRvYtWsX2rZta5KYDUWhYNeULrKy2GoD5CY3//0HdOwoRkO5ugK7dwMNGsgaGhGRWZBttNSDBw+gVCrh89z0sD4+Prhy5UqBx/Ts2RMPHjzAq6++CkmSkJ2djYEDBxbaLZWRkYGMjAz145SUFMO8AD1VrQqcO8eiYm389JNo6SpXDhg4UO5o5OPuDnh7i+Rmzx4x98327UDTpnJHRkRkHmQvKNbG4cOHMX36dCxduhRnz55FdHQ0du7cic9VE54UYMaMGfD09FTfAgMDTRjxi6nqbthyUzxstdFUoYL46eAgllRo1UreeIiIzIlsLTdlypSBvb097t69q7H97t278PX1LfCYiRMn4r333sMHH3wAAKhTpw7S0tIwYMAAjB8/HnYFLHM8btw4jBo1Sv04JSXFLBIcVbcUW26K58cfc1ttbLXWJq+33xYrmq9aJRbFJJKTUqlEVlaW3GGQFXB0dCzwu1xbsiU3jo6OaNCgAQ4ePIiOHTsCAHJycnDw4EEMHTq0wGPS09PzvWj7/03lKxW0+iQAJycnOJnhgkKsuSm+vK02Y8aI+hJb98UXYmbmEiXkjoRsmSRJSEpKwuPHj+UOhayEnZ0dKlasCEc9V/iVdYbiUaNGISoqCg0bNkTjxo0xf/58pKWloW/fvgCA3r17o3z58pgxYwYAICIiAvPmzUP9+vXRpEkTXL9+HRMnTkRERIQ6ybEUqm6phAQgLY3dLIX58Ucx466t19o8j4kNyU2V2JQrVw6urq5QWOOCbmQyOTk5uHPnDhITE1GhQgW9Pk+yJjfdunXD/fv3MWnSJCQlJaFevXrYs2ePusg4Pj5eo6VmwoQJUCgUmDBhAhISElC2bFlERETgyy+/lOsl6Kx06dyi0OvXxWKPlB9bbYjMk1KpVCc2pUuXljscshJly5bFnTt3kJ2djRJ6/AWnkF7Un2OlUlJS4OnpieTkZHh4eMgayyuvAH/8AWzaBHTuLGsoZuu774APPgB8fETNDZMbIvPw7NkzxMXFITg4GC4uLnKHQ1bi6dOnuHnzJipWrAhnZ2eN57T5/rao0VLWhkXFhWOrDZH5Y1cUGZKhPk9MbmTE4eCF++EH4OZN0Wrz4YdyR0NERJaCyY2M2HLzYmy1ISJLEhwcjPnz5xd7/8OHD0OhUBh9pNnq1avh5eVl1GuYI1kLim0dW25ejK02RLZDqRTroyUmAn5+QPPmgLEGwBbV7TF58mRMmTJF6/OeOnUKJbUY9tq0aVMkJibC09NT62tR0ZjcyEjVcnP/PvD4MWCDyXWBMjNzW23GjmWrDZE1i44GRowA/v03d1tAALBgARAZafjrJSYmqu9v2LABkyZNwtWrV9Xb3Nzc1PclSYJSqYSDQ9FflWXLltUqDkdHxxdOWEv6Y7eUjNzdRcsEwK6pvFStNr6+bLUhsmbR0WKkaN7EBhDzf3XuLJ43NF9fX/XN09MTCoVC/fjKlStwd3fH7t270aBBAzg5OeH333/HP//8gw4dOsDHxwdubm5o1KgRDhw4oHHe57ulFAoFvv32W7zzzjtwdXVF1apVsX37dvXzz3dLqbqP9u7dixo1asDNzQ2tW7fWSMays7MxfPhweHl5oXTp0hgzZgyioqLUE+EW17Jly1C5cmU4OjqiWrVq+PHHH9XPSZKEKVOmoEKFCnBycoK/vz+GDx+ufn7p0qWoWrUqnJ2d4ePjg85mOtSXyY3MVF1TTG6EzExANW3RmDEAR5gSWSelUrTYFDQZiWrbyJFiP1MbO3YsZs6cicuXL6Nu3bpITU1F27ZtcfDgQZw7dw6tW7dGREQE4uPjCz3P1KlT0bVrV1y4cAFt27ZFr1698OjRoxfun56ejjlz5uDHH3/EkSNHEB8fj9GjR6uf/7//+z+sWbMGq1atwrFjx5CSkoJt27Zp9dq2bt2KESNG4OOPP8aff/6JDz/8EH379sWhQ4cAAFu2bMFXX32Fr7/+GteuXcO2bdtQp04dAMDp06cxfPhwTJs2DVevXsWePXvQokULra5vMpIO4uPjpdu3b6sf//HHH9KIESOkr7/+WpfTmVRycrIEQEpOTpY7FEmSJOn99yUJkKTJk+WOxDx88414P3x9JSk9Xe5oiOhFnj59Kv3111/S06dPdTr+0CHxf72o26FDBg1bw6pVqyRPT888MR2SAEjbtm0r8thatWpJixYtUj8OCgqSvvrqK/VjANKECRPUj1NTUyUA0u7duzWu9d9//6ljASBdv35dfcySJUskHx8f9WMfHx9p9uzZ6sfZ2dlShQoVpA4dOhT7NTZt2lTq37+/xj5dunSR2rZtK0mSJM2dO1d66aWXpMzMzHzn2rJli+Th4SGlpKS88Hr6Kuxzpc33t04tNz179lRneUlJSXjzzTdx8uRJjB8/HtOmTTNM1mUj2HKT6/laG7baEFmvPL0tBtnPkBo2bKjxODU1FaNHj0aNGjXg5eUFNzc3XL58uciWm7p166rvlyxZEh4eHrh3794L93d1dUXlypXVj/38/NT7Jycn4+7du2jcuLH6eXt7ezRo0ECr13b58mU0a9ZMY1uzZs1w+fJlAECXLl3w9OlTVKpUCf3798fWrVuRnZ0NAHjzzTcRFBSESpUq4b333sOaNWuQnp6u1fVNRafk5s8//1S/wRs3bkTt2rVx/PhxrFmzBqtXrzZkfFaPC2jm+v574NYtUWszYIDc0RCRMfn5GXY/Q3p+1NPo0aOxdetWTJ8+HUePHkVsbCzq1KmDzMzMQs/z/PIBCoUCOTk5Wu0vmXgRgcDAQFy9ehVLly6Fi4sLBg8ejBYtWiArKwvu7u44e/Ys1q1bBz8/P0yaNAkhISFmuXCqTslNVlaWeqXtAwcOoH379gCA6tWraxQ/UdHyttzY1kIYmvLW2rDVhsj6NW8uRkW9aGS2QgEEBor95Hbs2DH06dMH77zzDurUqQNfX1/cvHnTpDF4enrCx8cHp06dUm9TKpU4e/asVuepUaMGjh07prHt2LFjqFmzpvqxi4sLIiIisHDhQhw+fBgxMTG4ePEiAMDBwQFhYWGYNWsWLly4gJs3b+LXX3/V45UZh05DwWvVqoXly5ejXbt22L9/Pz7//HMAwJ07d7iAmpZULZDJycCDB4CWowmthqrVxs+PrTZEtsDeXgz37txZJDJ5/7hTJTzz5xtvvhttVK1aFdHR0YiIiIBCocDEiRMLbYExlmHDhmHGjBmoUqUKqlevjkWLFuG///7TasmCTz75BF27dkX9+vURFhaGHTt2IDo6Wj36a/Xq1VAqlWjSpAlcXV3x008/wcXFBUFBQfjll19w48YNtGjRAt7e3ti1axdycnJQrVo1Y71knenUcvN///d/+Prrr9GyZUv06NEDIf9b0nr79u0a/YFUNBcXoEIFcd9Wu6bYakNkmyIjgc2bgfLlNbcHBIjtxpjnRhfz5s2Dt7c3mjZtioiICISHh+Pll182eRxjxoxBjx490Lt3b4SGhsLNzQ3h4eH5FpgsTMeOHbFgwQLMmTMHtWrVwtdff41Vq1ahZcuWAAAvLy988803aNasGerWrYsDBw5gx44dKF26NLy8vBAdHY033ngDNWrUwPLly7Fu3TrUqlXLSK9YdzqvCq5UKpGSkgJvb2/1tps3b8LV1RXlypUzWICGZk6rgquEhQEHDwKrVgF9+sgdjemtWCHms/HzA/75h8kNkSVQrQpe0OrN2jLlDMXWJCcnBzVq1EDXrl3VPSiWrrDPlTbf3zp1Sz19+hSSJKkTm1u3bmHr1q2oUaMGwsPDdTmlTataVSQ3tthyw1YbIrK3B/7XcECFuHXrFvbt24fXXnsNGRkZWLx4MeLi4tCzZ0+5QzM7OnVLdejQAT/88AMA4PHjx2jSpAnmzp2Ljh07YtmyZQYN0BbY6nDwjAxg0CAgPl78tda/v9wRERGZLzs7O6xevRqNGjVCs2bNcPHiRRw4cAA1atSQOzSzo1Nyc/bsWTT/Xwn75s2b4ePjg1u3buGHH37AwoULDRqgLbDF4eDx8aLpeeVKUTw4axZbbYiIChMYGIhjx44hOTkZKSkpOH78uPnOECwznZKb9PR0uLu7AwD27duHyMhI2NnZ4ZVXXsGtW7cMGqAtULXcXL8OyFCAb3L79gEvvwycOgWUKgXs2gW8+67cURERkbXQKbmpUqUKtm3bhtu3b2Pv3r146623AAD37t0zmyJdS1KxouhzTk8H7tyROxrjyckRMxC3bg08fAg0aACcOSMeExERGYpOyc2kSZMwevRoBAcHo3HjxggNDQUgWnHq169v0ABtQYkSIsEBrLfu5r//gPbtgYkTxXwW/fsDv/8OBAfLHRkREVkbnZKbzp07Iz4+HqdPn8bevXvV21u1aoWvvvrKYMHZEtUcSKtXW99MxbGxQMOGwM6dgJOTqLNZsQLQc/QoERFRgXRKbgDA19cX9evXx507d/Dvv/8CABo3bozq1asbLDhbMnw4YGcH/PADMHWq3NEYzurVQGgocOOGaJ2KiQH69pU7KiIismY6JTc5OTmYNm0aPD09ERQUhKCgIHh5eeHzzz+XZUpqa/DWW8DSpeL+1KnAt9/KG4++nj0TE/P17Svut20r6mvYa0lERMamU3Izfvx4LF68GDNnzsS5c+dw7tw5TJ8+HYsWLcLEiRMNHaPN+PBDYPx4cX/gQDGKyBLduiWGea9YIYZ5T5sG7NgB5JnMmojIorVs2RIjR45UPw4ODsb8+fMLPUahUGDbtm16X9tQ5ynMlClTUK9ePaNew5h0mqH4+++/x7fffqteDRwA6tati/Lly2Pw4MH4UjXlLGnt88+Bf/8VC0l26QIcPgw0amTcay5fDixeDJQrB4SE5N5q1hQ1MtrYuxfo2RN49EgM8167FuCk1URkLiIiIpCVlYU9e/bke+7o0aNo0aIFzp8/j7p162p13lOnTqFkyZKGChOASDC2bduG2NhYje2JiYkaSx9RfjolN48ePSqwtqZ69ep49OiR3kHZMoUC+OYbIClJJArt2gHHjwNVqhj+WtnZwIgRud1hly4Bhw7lPu/gAFSvrpnwhIQAPj75z5WTI5ZRmDxZFEQ3bCgWvgsKMnzcRES66tevHzp16oR///0XAQEBGs+tWrUKDRs21DqxAYCyZcsaKsQi+fr6muxalkqnbqmQkBAsXrw43/bFixfr9KEgTSVKAJs2iYnu7t8H2rQRPw3p8WNRB7N0qUiopk4Vo5hGjBBrvHh7i+Tnzz+BNWuATz8VLTC+vuIWHi62rVkjamnatwcmTRKJzYABYhE8JjZEZG7efvttlC1bFqtXr9bYnpqaik2bNqFfv354+PAhevTogfLly8PV1RV16tTBunXrCj3v891S165dQ4sWLeDs7IyaNWti//79+Y4ZM2YMXnrpJbi6uqJSpUqYOHEisrKyAACrV6/G1KlTcf78eSgUCigUCnXMz3dLXbx4EW+88QZcXFxQunRpDBgwAKmpqern+/Tpg44dO2LOnDnw8/ND6dKlMWTIEPW1ikNVaxsQEAAnJyfUq1dPo/UrMzMTQ4cOhZ+fH5ydnREUFIQZM2YAACRJwpQpU1ChQgU4OTnB398fw4cPL/a1daFTy82sWbPQrl07HDhwQD3HTUxMDG7fvo1dllooYmbc3cXQ6dBQMXPx228Dv/4KGKLV859/xPmuXAFcXUWC0rGj5j6SJLrHzp/XvF27Bty9K2YZ3rdP8xhnZ2DZMttc2ZyIxO+N9HR5ru3qKv5QK4qDgwN69+6N1atXY/z48VD876BNmzZBqVSiR48eSE1NRYMGDTBmzBh4eHhg586deO+991C5cmU0bty4yGvk5OQgMjISPj4++OOPP5CcnKxRn6Pi7u6O1atXw9/fHxcvXkT//v3h7u6OTz/9FN26dcOff/6JPXv24MCBAwAAT0/PfOdIS0tDeHg4QkNDcerUKdy7dw8ffPABhg4dqpHAHTp0CH5+fjh06BCuX7+Obt26oV69euhfzEX9FixYgLlz5+Lrr79G/fr1sXLlSrRv3x6XLl1C1apVsXDhQmzfvh0bN25EhQoVcPv2bdy+fRsAsGXLFnz11VdYv349atWqhaSkJJw/f75Y19WZpKOEhATps88+kyIjI6XIyEhp/Pjx0q1bt6T+/fvrekqTSE5OlgBIycnJcodSLFeuSFKpUpIESNLbb0tSVpZ+5/vtN0kqXVqcLyBAks6d0+741FRJOnFCkr7+WpIGD5akpk0lyd1dkurW1f5cRGS5nj59Kv3111/S06dP1dtSU8XvFjluqanFj/3y5csSAOnQoUPqbc2bN5fefffdFx7Trl076eOPP1Y/fu2116QRI0aoHwcFBUlfffWVJEmStHfvXsnBwUFKSEhQP797924JgLR169YXXmP27NlSgwYN1I8nT54shYSE5Nsv73lWrFgheXt7S6l53oCdO3dKdnZ2UlJSkiRJkhQVFSUFBQVJ2dnZ6n26dOkidevW7YWxPH9tf39/6csvv9TYp1GjRtLgwYMlSZKkYcOGSW+88YaUk5OT71xz586VXnrpJSkzM/OF11Mp6HOlos33t04tNwDg7++fr3D4/Pnz+O6777BixQp98i3Ko1o1MdKoVSvgl1+AwYOBr78u3l8oz1u1SozIysoCGjcGtm0Tq3Fro2RJoEkTcVORJN3iISKSQ/Xq1dG0aVOsXLkSLVu2xPXr13H06FFMmzYNAKBUKjF9+nRs3LgRCQkJyMzMREZGBlxdXYt1/suXLyMwMBD+/v7qbapejrw2bNiAhQsX4p9//kFqaiqys7O1XsLo8uXLCAkJ0ShmbtasGXJycnD16lX4/K9IslatWrC3t1fv4+fnh4sXLxbrGikpKbhz5w6aNWumsb1Zs2bqFpg+ffrgzTffRLVq1dC6dWu8/fbb6qWZunTpgvnz56NSpUpo3bo12rZti4iICDg46JyCFEnnSfzIdJo2BdatE5P8ffONWJ9JG0ol8MknwPvvi8Sma1cxCkvbxOZFmNgQESC6hlJT5bkVM+9Q69evH7Zs2YInT55g1apVqFy5Ml577TUAwOzZs7FgwQKMGTMGhw4dQmxsLMLDw5GZmWmw9yomJga9evVC27Zt8csvv+DcuXMYP368Qa+RV4kSJTQeKxQKg85L9/LLLyMuLg6ff/45nj59iq5du6Jz584AxGrmV69exdKlS+Hi4oLBgwejRYsWWtX8aIvJjYXo2BFYtEjcnzRJtMIUR2oqEBkJzJkjHk+eDKxfD7i4GCVMIrJhCoVo3ZXjpu0fWV27doWdnR3Wrl2LH374Ae+//766/ubYsWPo0KED3n33XYSEhKBSpUr4+++/i33uGjVq4Pbt20hMTFRvO3HihMY+x48fR1BQEMaPH4+GDRuiatWquHXrlsY+jo6OUCqVRV7r/PnzSEtLU287duwY7OzsUE21ro+ePDw84O/vj2PHjmlsP3bsGGrWrKmxX7du3fDNN99gw4YN2LJli3oEtYuLCyIiIrBw4UIcPnwYMTExxW450oXx2oTI4AYPBm7fBmbOFAtP+vkVvqJ2fLwYxXT+vJivZvVqoHt3k4VLRGS23Nzc0K1bN4wbNw4pKSnok2ckRNWqVbF582YcP34c3t7emDdvHu7evavxRV6YsLAwvPTSS4iKisLs2bORkpKC8aoZWvNcIz4+HuvXr0ejRo2wc+dObN26VWOf4OBgxMXFITY2FgEBAXB3d4fTc5OP9erVC5MnT0ZUVBSmTJmC+/fvY9iwYXjvvffUXVKG8Mknn2Dy5MmoXLky6tWrh1WrViE2NhZr1qwBAMybNw9+fn6oX78+7OzssGnTJvj6+sLLywurV6+GUqlEkyZN4Orqip9++gkuLi4IMuKQWq2Sm8jIyEKff/z4sT6xUDFMny5GMf30E9C5M/Dbb0CDBvn3++MPoEMHMbLJx0fU17zyisnDJSIyW/369cN3332Htm3batTHTJgwATdu3EB4eDhcXV0xYMAAdOzYEcnJycU6r52dHbZu3Yp+/fqhcePGCA4OxsKFC9E6z1+j7du3x0cffYShQ4ciIyMD7dq1w8SJEzFlyhT1Pp06dUJ0dDRef/11PH78GKtWrdJIwgDA1dUVe/fuxYgRI9CoUSO4urqiU6dOmDdvnl7vzfOGDx+O5ORkfPzxx7h37x5q1qyJ7du3o2rVqgDEyK9Zs2bh2rVrsLe3R6NGjbBr1y7Y2dnBy8sLM2fOxKhRo6BUKlGnTh3s2LEDpUuXNmiMeSkkqfhrUPct5oqHq4rbZyKDlJQUeHp6Ijk5WevCLXORmSkm9ztwQMwqHBMDVKqU+/z69WI4dkYGULeuKEiuUEG2cInICj179gxxcXGoWLEinJ2d5Q6HrERhnyttvr+1arkx56TFljg6Alu2AC1aiC6n1q3FLMalS4vJ+FSrikdEiDls3N3ljZeIiMiUWHNjoTw8xMKaoaFiYr2ICDEj8IYN4vlPPgFmzADyjPwjIiKyCUxuLJi/P7BnD9CsGXDihLg5OIh5cN5/X+7oiIiI5MGh4BauRg1g+3YxtLtUKVGHw8SGiIhsGVturMCrrwI3b4oEh/U1RGRKWoxJISqSoT5PbLmxEuXKMbEhItNRzXibLtdKmWSVVDM02+tZMMqWGyIi0pq9vT28vLxw7949AGK+FQXXYiE95OTk4P79+3B1ddV73SnZk5slS5Zg9uzZSEpKQkhICBYtWlTokvKPHz/G+PHjER0djUePHiEoKAjz589H27ZtTRi1eVEqgaNHgcREMWtx8+YcJUVExufr6wsA6gSHSF92dnaoUKGC3omyrMnNhg0bMGrUKCxfvhxNmjTB/PnzER4ejqtXr6JcuXL59s/MzMSbb76JcuXKYfPmzShfvjxu3boFLy8v0wdvJqKjgREjxKzFKgEBwIIFYk0pIiJjUSgU8PPzQ7ly5Yy6CCLZDkdHR9jZ6V8xo9UMxYbWpEkTNGrUCIsXLwYgmqQCAwMxbNgwjB07Nt/+y5cvx+zZs3HlypV8K5wWlzXMUKwSHS2WYHj+X1CV8G7ezASHiIisgzbf37IVFGdmZuLMmTMICwvLDcbODmFhYYiJiSnwmO3btyM0NBRDhgyBj48PateujenTpxe5aqo1UipFi01Bqalq28iRYj8iIiJbIlty8+DBAyiVynyrlvr4+CApKanAY27cuIHNmzdDqVRi165dmDhxIubOnYsvvvjihdfJyMhASkqKxs0aHD2q2RX1PEkSK4gfPWq6mIiIiMyBRQ0Fz8nJQbly5bBixQo0aNAA3bp1w/jx47F8+fIXHjNjxgx4enqqb4GBgSaM2HgSEw27HxERkbWQLbkpU6YM7O3tcffuXY3td+/eVVfgP8/Pzw8vvfSSxvj3GjVqICkpST02/nnjxo1DcnKy+nb79m3DvQgZ+fkZdj8iIiJrIVty4+joiAYNGuDgwYPqbTk5OTh48CBCQ0MLPKZZs2a4fv06cnJy1Nv+/vtv+Pn5wdHRscBjnJyc4OHhoXGzBs2bi1FRLxotp1AAgYFiPyIiIlsia7fUqFGj8M033+D777/H5cuXMWjQIKSlpaFv374AgN69e2PcuHHq/QcNGoRHjx5hxIgR+Pvvv7Fz505Mnz4dQ4YMkeslyMbeXgz3BvInOKrH8+dzvhsiIrI9ss5z061bN9y/fx+TJk1CUlIS6tWrhz179qiLjOPj4zXGuwcGBmLv3r346KOPULduXZQvXx4jRozAmDFj5HoJsoqMFMO9C5rnZv58DgMnIiLbJOs8N3KwpnluVDhDMRERWTttvr9lX36B9GdvD7RsKXcURERE5sGihoITERERFYXJDREREVkVJjdERERkVZjcEBERkVVhckNERERWhckNERERWRUmN0RERGRVmNwQERGRVWFyQ0RERFaFyQ0RERFZFSY3REREZFWY3BAREZFVYXJDREREVoXJDREREVkVJjdERERkVZjcEBERkVVhckNERERWhckNERERWRUmN0RERGRVmNwQERGRVWFyQ0RERFaFyQ0RERFZFSY3REREZFWY3BAREZFVYXJDREREVoXJDREREVkVB7kDIHkplcDRo0BiIuDnBzRvDtjbyx0VERGR7pjc2LDoaGDECODff3O3BQQACxYAkZHyxUVERKQPdkvZqOhooHNnzcQGABISxPboaHniIiIi0heTGxukVIoWG0nK/5xq28iRYj8iIiJLw+TGBh09mr/FJi9JAm7fFvsRERFZGiY3Nigx0bD7ERERmRMmNzbIz8+w+xEREZkTJjc2qHlzMSpKoSj4eYUCCAwU+xEREVkaJjc2yN5eDPcG8ic4qsfz53O+GyIiskxMbmxUZCSweTNQvrzm9oAAsZ3z3BARkaXiJH42LDIS6NCBMxQTEZF1YXJj4+ztgZYt5Y6CiIjIcNgtRURERFaFyQ0RERFZFSY3REREZFXMIrlZsmQJgoOD4ezsjCZNmuDkyZPFOm79+vVQKBTo2LGjcQMkIiIiiyF7crNhwwaMGjUKkydPxtmzZxESEoLw8HDcu3ev0ONu3ryJ0aNHozlnmiMiIqI8ZE9u5s2bh/79+6Nv376oWbMmli9fDldXV6xcufKFxyiVSvTq1QtTp05FpUqVTBgtERERmTtZk5vMzEycOXMGYWFh6m12dnYICwtDTEzMC4+bNm0aypUrh379+pkiTCIiIrIgss5z8+DBAyiVSvj4+Ghs9/HxwZUrVwo85vfff8d3332H2NjYYl0jIyMDGRkZ6scpKSk6x0tERETmT/ZuKW08efIE7733Hr755huUKVOmWMfMmDEDnp6e6ltgYKCRoyQiIiI5ydpyU6ZMGdjb2+Pu3bsa2+/evQtfX998+//zzz+4efMmIiIi1NtycnIAAA4ODrh69SoqV66sccy4ceMwatQo9eOUlBQmOERERFZM1uTG0dERDRo0wMGDB9XDuXNycnDw4EEMHTo03/7Vq1fHxYsXNbZNmDABT548wYIFCwpMWpycnODk5GSU+ImIiMj8yL621KhRoxAVFYWGDRuicePGmD9/PtLS0tC3b18AQO/evVG+fHnMmDEDzs7OqF27tsbxXl5eAJBvOxEREdkm2ZObbt264f79+5g0aRKSkpJQr1497NmzR11kHB8fDzs7iyoNIiIiIhkpJEmS5A7ClFJSUuDp6Ynk5GR4eHjIHY7FUyqBo0eBxETAzw9o3lysNE5ERGRI2nx/y95yQ5YrOhoYMQL499/cbQEBwIIFQGSkfHEREZFtY38P6SQ6GujcWTOxAYCEBLE9OlqeuIiIiJjckNaUStFiU1CHpmrbyJFiPyIiIlNjckNaO3o0f4tNXpIE3L4t9iMiIjI1JjektcREw+5HRERkSExuSGt+fobdj4iIyJCY3JDWmjcXo6IUioKfVyiAwECxHxERkakxuSGt2duL4d5A/gRH9Xj+fM53Q0RE8mByQzqJjAQ2bwbKl9fcHhAgtnOeGyIikgsn8SOdRUYCHTpwhmIiIjIvTG5IL/b2QMuWckdBRESUi91SREREZFWY3BAREZFVYXJDREREVoXJDREREVkVFhSTrJRKjrYiIiLDYnJDsomOFquL512EMyBATBDIeXKIiEhX7JYiWURHA507519dPCFBbI+OlicuIiKyfExuyOSUStFiI0n5n1NtGzlS7EdERKQtJjdkckeP5m+xyUuSgNu3xX5ERETaYnJDJpeYaNj9iIiI8mJyQybn52fY/YiIiPJickMm17y5GBWlUBT8vEIBBAaK/YiIiLTF5IZMzt5eDPcG8ic4qsfz53O+GyIi0g2TG5JFZCSweTNQvrzm9oAAsZ3z3BARka44iR/JJjIS6NCBMxQTEZFhMbkhWdnbAy1byh0FERFZE3ZLERERkVVhckNERERWhckNERERWRUmN0RERGRVWFBMFkup5EgrIiLKj8kNWaToaLGyeN4FOAMCxOSAnCOHiMi2sVuKLE50NNC5c/6VxRMSxPboaHniIiIi88DkhiyKUilabCQp/3OqbSNHiv2IiMg2Mbkhi3L0aP4Wm7wkCbh9W+xHRES2iTU3ZFESEw23HwuSiYisE5Mbsih+fobZjwXJRETWi91SZFGaNxdJiEJR8PMKBRAYKPZ7ERYkExFZNyY3ZFHs7UXrCpA/wVE9nj//xd1LLEgmIrJ+TG7I4kRGAps3A+XLa24PCBDbC+tWMpeCZKUSOHwYWLdO/GQyRURkOKy5IYsUGQl06KB9QbChCpL1KUZmvQ8RkXGZRcvNkiVLEBwcDGdnZzRp0gQnT5584b7ffPMNmjdvDm9vb3h7eyMsLKzQ/cl62dsDLVsCPXqIn8VJLgxRkBwdDQQHA6+/DvTsKX4GBxevVof1PkRExid7crNhwwaMGjUKkydPxtmzZxESEoLw8HDcu3evwP0PHz6MHj164NChQ4iJiUFgYCDeeustJCQkmDhyskT6FiTrk5yw3oeIyDQUklTQr1rTadKkCRo1aoTFixcDAHJychAYGIhhw4Zh7NixRR6vVCrh7e2NxYsXo3fv3kXun5KSAk9PTyQnJ8PDw0Pv+MnyqBIUQDPRUCU8L6rbUSpFC82LanYUCpE4xcUV3Ip0+LBo5SnKoUOiJYqIiHJp8/0ta8tNZmYmzpw5g7CwMPU2Ozs7hIWFISYmpljnSE9PR1ZWFkqVKmWsMMnK6FqQrG8xsiHrfViMTET0YrIWFD948ABKpRI+Pj4a2318fHDlypVinWPMmDHw9/fXSJDyysjIQEZGhvpxSkqK7gGT1dClIFnf5MRQ9T4sRiYiKpxFj5aaOXMm1q9fj8OHD8PZ2bnAfWbMmIGpU6eaODKyBKqC5OLSNzlR1fskJBRcd6Pq1iqq3uf5Y1X1PkUNgycishWydkuVKVMG9vb2uHv3rsb2u3fvwtfXt9Bj58yZg5kzZ2Lfvn2oW7fuC/cbN24ckpOT1bfbt28bJHayPfoWI+szASGLkYmIik/W5MbR0RENGjTAwYMH1dtycnJw8OBBhIaGvvC4WbNm4fPPP8eePXvQsGHDQq/h5OQEDw8PjRuRLvSdHRmQr96HiMiWyN4tNWrUKERFRaFhw4Zo3Lgx5s+fj7S0NPTt2xcA0Lt3b5QvXx4zZswAAPzf//0fJk2ahLVr1yI4OBhJSUkAADc3N7i5ucn2Osg2qJKTgupe5s8vXreQHPU+RES2RPbkplu3brh//z4mTZqEpKQk1KtXD3v27FEXGcfHx8POLreBadmyZcjMzERn1Vje/5k8eTKmTJliytDJRuk6O3Jepq73ISKyJbLPc2NqnOeGLJFqjp2iipFfNMcOEZGls5h5boioeAxR70NEZCuY3BBZCH1WQ8+LkwASkbWTveaGiIpP33ofTgJIRLaANTdENuJFkwAWtaYWEZE5YM0NEWngJIBEZEuY3BDZAE4CSES2hMkNkQ3gJIBEZEtYUExkAww1CaBSqd/khUREpsCWGyIboO+in4AoSA4OBl5/HejZU/wMDhbbiYjMCZMbIhug7ySAqpFWz9ftJCSI7cVNcDjHDhGZApMbIhuh6ySAhhppZcstP0zqiEyL89wQ2Rht62YOHxaJSFEOHXrxYqDWMMeOrvVGnDiRyDC0+f5mQTGRjdF2RXJ9R1oV1fKjUIiWnw4dzLc4WdcE5UVJnao7r7hJHQu5ibTDbikiKpS+I60MOceOHN07utYbmUt3HrvEyBYxuSGiQuk70spQc+zI8SWvT4JiiKRO30JuQ9Q5MTkiS8TkhogKpe9IK0PMsSPXl7w+CYqxu/OAwlt+DDHCzZaLwMmyMbkhoiLpOtIK0L/lR84veX0SFDm78wzRJWao4f9EcmByQ0TFEhkJ3LwpRkWtXSt+xsUVXRCrb8uPnF/y+iQocnbn6dslZqh6IXZpkVyY3BBRsalGWvXoIX4Wd8SOPi0/cn7J65OgyNmdp2+XmKHqhVjvQ3JhckNEJqFry4+cX/L6Jihydefp2yWm7/vGeh+SGyfxIyKzplSKL7WEhIK7SRQKkQTExeVPMgwxASFQ8Dw3gYEisTHmPDWqJAHQfO1FTX6oz3sG6Pe+qa79opafoq4NGGbSR84NZH20+f5mckNEZk+uL/nnzyXHl6WuiZWu7xkgb0JpqORI31mh5UyO9L22JcdeGK2+vyUbk5ycLAGQkpOT5Q6FiLSwZYskBQRIkvi6FbfAQLG9qOMUCnHLe6xqW1HHm4PsbEk6dEiS1q4VP7Ozi3ecru+Z6lhd3re1azX3f9Ft7dqCjz90qHjHHzpUeNzP76/Nv3dB71tAgHafFUP+m2lzbUPEritjX1ub728mN0RkMeT4krd0ur5nkqTb+6ZvcqJPcpSdnT/e5xOcwMDC3wM5kyN9r22I2PX5P6bvtYuizfc3u6WIyCawBkM32r5vctb7mEuXmC71QvpeW87uPENcuzi0+f7maCkisgm6DmO3ddq+b/qOMNNnlJjcQ+DlXK5D3+P1GeFmyPXjDIXJDRERGZQ+Q+D1SY7kHgIv53Id+hyv76SNhlo/zpCY3BARkcHpOq+R6lhdkiN9Z4WWMznS99r6HK9vy4sh1o8zNAfTXYqIiGyJqktLF5GRQIcO2tX7qFp9OncWiUxBQ+CL0yVWVL2QMZIjfa+tz/H6trzoG7sxsOWGiIjMki51UnJ1iQHyLtchZ3eevrEbA5MbIiKyKnJ0iQHyLtehz/H6ducZInZD41BwIiKi5+gzdYBcy3Xoc7w+M1obMvbCcPmFQjC5ISIiY7PEeZX0TcqMjclNIZjcEBERFcyckzJtvr85WoqIiIgA6DfCzZywoJiIiIisCpMbIiIisipMboiIiMiqMLkhIiIiq8LkhoiIiKwKkxsiIiKyKkxuiIiIyKowuSEiIiKrwuSGiIiIrIrNzVCsWm0iJSVF5kiIiIiouFTf28VZNcrmkpsnT54AAAIDA2WOhIiIiLT15MkTeHp6FrqPzS2cmZOTgzt37sDd3R0K1Vru/5OSkoLAwEDcvn2bi2pqge+bbvi+6Ybvm/b4numG75tujPW+SZKEJ0+ewN/fH3Z2hVfV2FzLjZ2dHQICAgrdx8PDgx9kHfB90w3fN93wfdMe3zPd8H3TjTHet6JabFRYUExERERWhckNERERWRUmN3k4OTlh8uTJcHJykjsUi8L3TTd833TD9017fM90w/dNN+bwvtlcQTERERFZN7bcEBERkVVhckNERERWhckNERERWRUmN0RERGRVmNzksWTJEgQHB8PZ2RlNmjTByZMn5Q7JrE2ZMgUKhULjVr16dbnDMjtHjhxBREQE/P39oVAosG3bNo3nJUnCpEmT4OfnBxcXF4SFheHatWvyBGsminrP+vTpk++z17p1a3mCNRMzZsxAo0aN4O7ujnLlyqFjx464evWqxj7Pnj3DkCFDULp0abi5uaFTp064e/euTBGbh+K8by1btsz3eRs4cKBMEZuHZcuWoW7duuqJ+kJDQ7F7927183J/1pjc/M+GDRswatQoTJ48GWfPnkVISAjCw8Nx7949uUMza7Vq1UJiYqL69vvvv8sdktlJS0tDSEgIlixZUuDzs2bNwsKFC7F8+XL88ccfKFmyJMLDw/Hs2TMTR2o+inrPAKB169Yan71169aZMELz89tvv2HIkCE4ceIE9u/fj6ysLLz11ltIS0tT7/PRRx9hx44d2LRpE3777TfcuXMHkZGRMkYtv+K8bwDQv39/jc/brFmzZIrYPAQEBGDmzJk4c+YMTp8+jTfeeAMdOnTApUuXAJjBZ00iSZIkqXHjxtKQIUPUj5VKpeTv7y/NmDFDxqjM2+TJk6WQkBC5w7AoAKStW7eqH+fk5Ei+vr7S7Nmz1dseP34sOTk5SevWrZMhQvPz/HsmSZIUFRUldejQQZZ4LMW9e/ckANJvv/0mSZL4XJUoUULatGmTep/Lly9LAKSYmBi5wjQ7z79vkiRJr732mjRixAj5grIQ3t7e0rfffmsWnzW23ADIzMzEmTNnEBYWpt5mZ2eHsLAwxMTEyBiZ+bt27Rr8/f1RqVIl9OrVC/Hx8XKHZFHi4uKQlJSk8dnz9PREkyZN+NkrwuHDh1GuXDlUq1YNgwYNwsOHD+UOyawkJycDAEqVKgUAOHPmDLKysjQ+a9WrV0eFChX4Wcvj+fdNZc2aNShTpgxq166NcePGIT09XY7wzJJSqcT69euRlpaG0NBQs/is2dzCmQV58OABlEolfHx8NLb7+PjgypUrMkVl/po0aYLVq1ejWrVqSExMxNSpU9G8eXP8+eefcHd3lzs8i5CUlAQABX72VM9Rfq1bt0ZkZCQqVqyIf/75B5999hnatGmDmJgY2Nvbyx2e7HJycjBy5Eg0a9YMtWvXBiA+a46OjvDy8tLYl5+1XAW9bwDQs2dPBAUFwd/fHxcuXMCYMWNw9epVREdHyxit/C5evIjQ0FA8e/YMbm5u2Lp1K2rWrInY2FjZP2tMbkhnbdq0Ud+vW7cumjRpgqCgIGzcuBH9+vWTMTKydt27d1ffr1OnDurWrYvKlSvj8OHDaNWqlYyRmYchQ4bgzz//ZA2cll70vg0YMEB9v06dOvDz80OrVq3wzz//oHLlyqYO02xUq1YNsbGxSE5OxubNmxEVFYXffvtN7rAAsKAYAFCmTBnY29vnq+S+e/cufH19ZYrK8nh5eeGll17C9evX5Q7FYqg+X/zs6adSpUooU6YMP3sAhg4dil9++QWHDh1CQECAeruvry8yMzPx+PFjjf35WRNe9L4VpEmTJgBg8583R0dHVKlSBQ0aNMCMGTMQEhKCBQsWmMVnjckNxD9QgwYNcPDgQfW2nJwcHDx4EKGhoTJGZllSU1Pxzz//wM/PT+5QLEbFihXh6+ur8dlLSUnBH3/8wc+eFv799188fPjQpj97kiRh6NCh2Lp1K3799VdUrFhR4/kGDRqgRIkSGp+1q1evIj4+3qY/a0W9bwWJjY0FAJv+vBUkJycHGRkZ5vFZM0nZsgVYv3695OTkJK1evVr666+/pAEDBkheXl5SUlKS3KGZrY8//lg6fPiwFBcXJx07dkwKCwuTypQpI927d0/u0MzKkydPpHPnzknnzp2TAEjz5s2Tzp07J926dUuSJEmaOXOm5OXlJf3888/ShQsXpA4dOkgVK1aUnj59KnPk8insPXvy5Ik0evRoKSYmRoqLi5MOHDggvfzyy1LVqlWlZ8+eyR26bAYNGiR5enpKhw8flhITE9W39PR09T4DBw6UKlSoIP3666/S6dOnpdDQUCk0NFTGqOVX1Pt2/fp1adq0adLp06eluLg46eeff5YqVaoktWjRQubI5TV27Fjpt99+k+Li4qQLFy5IY8eOlRQKhbRv3z5JkuT/rDG5yWPRokVShQoVJEdHR6lx48bSiRMn5A7JrHXr1k3y8/OTHB0dpfLly0vdunWTrl+/LndYZufQoUMSgHy3qKgoSZLEcPCJEydKPj4+kpOTk9SqVSvp6tWr8gYts8Les/T0dOmtt96SypYtK5UoUUIKCgqS+vfvb/N/iBT0fgGQVq1apd7n6dOn0uDBgyVvb2/J1dVVeuedd6TExET5gjYDRb1v8fHxUosWLaRSpUpJTk5OUpUqVaRPPvlESk5Oljdwmb3//vtSUFCQ5OjoKJUtW1Zq1aqVOrGRJPk/awpJkiTTtBERERERGR9rboiIiMiqMLkhIiIiq8LkhoiIiKwKkxsiIiKyKkxuiIiIyKowuSEiIiKrwuSGiIiIrAqTGyKySQqFAtu2bZM7DCIyAiY3RGRyffr0gUKhyHdr3bq13KERkRVwkDsAIrJNrVu3xqpVqzS2OTk5yRQNEVkTttwQkSycnJzg6+urcfP29gYguoyWLVuGNm3awMXFBZUqVcLmzZs1jr948SLeeOMNuLi4oHTp0hgwYABSU1M19lm5ciVq1aoFJycn+Pn5YejQoRrPP3jwAO+88w5cXV1RtWpVbN++Xf3cf//9h169eqFs2bJwcXFB1apV8yVjRGSemNwQkVmaOHEiOnXqhPPnz6NXr17o3r07Ll++DABIS0tDeHg4vL29cerUKWzatAkHDhzQSF6WLVuGIUOGYMCAAbh48SK2b9+OKlWqaFxj6tSp6Nq1Ky5cuIC2bduiV69eePTokfr6f/31F3bv3o3Lly9j2bJlKFOmjOneACLSncmW6CQi+p+oqCjJ3t5eKlmypMbtyy+/lCRJrNQ8cOBAjWOaNGkiDRo0SJIkSVqxYoXk7e0tpaamqp/fuXOnZGdnp14d3N/fXxo/fvwLYwAgTZgwQf04NTVVAiDt3r1bkiRJioiIkPr27WuYF0xEJsWaGyKSxeuvv45ly5ZpbCtVqpT6fmhoqMZzoaGhiI2NBQBcvnwZISEhKFmypPr5Zs2aIScnB1evXoVCocCdO3fQqlWrQmOoW7eu+n7JkiXh4eGBe/fuAQAGDRqETp064ezZs3jrrbfQsWNHNG3aVKfXSkSmxeSGiGRRsmTJfN1EhuLi4lKs/UqUKKHxWKFQICcnBwDQpk0b3Lp1C7t27cL+/fvRqlUrDBkyBHPmzDF4vERkWKy5ISKzdOLEiXyPa9SoAQCoUaMGzp8/j7S0NPXzx44dg52dHapVqwZ3d3cEBwfj4MGDesVQtmxZREVF4aeffsL8+fOxYsUKvc5HRKbBlhsikkVGRgaSkpI0tjk4OKiLdjdt2oSGDRvi1VdfxZo1a3Dy5El89913AIBevXph8uTJiIqKwpQpU3D//n0MGzYM7733Hnx8fAAAU6ZMwcCBA1GuXDm0adMGT548wbFjxzBs2LBixTdp0iQ0aNAAtWrVQkZGBn755Rd1ckVE5o3JDRHJYs+ePfDz89PYVq1aNVy5cgWAGMm0fv16DB48GH5+fli3bh1q1qwJAHB1dcXevXsxYsQINGrUCK6urujUqRPmzZunPldUVBSePXuGr776CqNHj0aZMmXQuXPnYsfn6OiIcePG4ebNm3BxcUHz5s2xfv16A7xyIjI2hSRJktxBEBHlpVAosHXrVnTs2FHuUIjIArHmhoiIiKwKkxsiIiKyKqy5ISKzw95yItIHW26IiIjIqjC5ISIiIqvC5IaIiIisCpMbIiIisipMboiIiMiqMLkhIiIiq8LkhoiIiKwKkxsiIiKyKkxuiIiIyKr8P6ENk0OXh4bxAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "acc = history_dict['accuracy']\n",
    "val_acc = history_dict['val_accuracy']\n",
    "loss = history_dict['loss']\n",
    "val_loss = history_dict['val_loss']\n",
    "\n",
    "epochs = range(1, len(acc) + 1)\n",
    "\n",
    "# \"bo\" is for \"blue dot\"\n",
    "plt.plot(epochs, loss, 'bo', label='Training loss')\n",
    "# b is for \"solid blue line\"\n",
    "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
    "plt.title('Training and validation loss')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Loss')\n",
    "plt.legend()\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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wbBhwwAAQ4YMwZQpU3Tbjxo1Crdv38a4cePwzz//YOvWrfjkk08wevRouT4CERERWRlZ29z0798fN2/exPTp05GWlobWrVtj+/btukbGycnJsLF5lH/5+/tjx44dePfdd9GyZUv4+vpi3LhxmDRpklwfgYiIiKyMrOPcyKGixrkhIiKiilMlxrkhIiIiqghMboiIiEhRmNwQERGRojC5ISIiIkVhckNERESKwuSGiIiIFIXJDRERESkKkxsiIiJSFCY3REREpChMboiIiEhRmNwQERGRojC5ISIiIkVhckNERESKwuSGiIiIFIXJDRERESkKkxsiIiJSFCY3REREpChMboiIiEhRmNwQERGRojC5ISIiIkVhckNERESKwuSGiIiIFIXJDRERESkKkxsiIiJSFCY3REREpChMboiIiEhRmNwQERGRojC5ISIiIkVhckNERESKwuSGiIiIFIXJDRERESkKkxsiIiJSFCY3REREpChMboiIiEhRmNwQERGRojC5ISIiIkVhckNERESKwuSGiIiIFIXJDRERESkKkxsiIiJSFCY3REREpChMboiIiEhRmNwQERGRolhFcrNkyRIEBgbCwcEBoaGhOHLkSInbrly5EiqVSm9xcHCoxGiJiIjImsme3Kxbtw4TJkzAjBkzcOzYMbRq1QqRkZG4ceNGifu4uLggNTVVt1y5cqUSIyYiIiJrJntys3DhQowYMQLDhg1D8+bNsWzZMjg5OeHbb78tcR+VSgUvLy/d4unpWYkRExERkTWTNbnJy8vD0aNHERERoVtnY2ODiIgIxMfHl7hfdnY2AgIC4O/vj549e+Lvv/+ujHCJiIioCpA1ucnIyIBGoylW8uLp6Ym0tDSD+zRp0gTffvstfv75Z/z4448oLCxE+/btce3aNYPb5+bmIisrS28hIiIi5ZK9WspUYWFhGDJkCFq3bo1OnTohNjYWHh4e+O9//2tw+7lz58LV1VW3+Pv7V3LEREREVJlkTW7c3d1ha2uL9PR0vfXp6enw8vIy6hh2dnZ46qmncOHCBYPvT5kyBZmZmbrl6tWrZsdNRERE1kvW5Mbe3h4hISGIi4vTrSssLERcXBzCwsKMOoZGo8GpU6fg7e1t8H21Wg0XFxe9hYiIiJSrhtwBTJgwAdHR0WjTpg3atWuHmJgY5OTkYNiwYQCAIUOGwNfXF3Pn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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(epochs, acc, 'bo', label='Training acc')\n",
    "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
    "plt.title('Training and validation accuracy')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.legend(loc='lower right')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "250/250 [==============================] - 2s 8ms/step - loss: 1.5338 - accuracy: 0.7601\n",
      "0.7601249814033508\n"
     ]
    }
   ],
   "source": [
    "export_model = tf.keras.Sequential([\n",
    "    vectorize_layer,\n",
    "    model,\n",
    "    layers.Activation('sigmoid')\n",
    "])\n",
    "\n",
    "export_model.compile(\n",
    "    loss=losses.SparseCategoricalCrossentropy(from_logits=False), optimizer=\"adam\", metrics=['accuracy']\n",
    ")\n",
    "\n",
    "# Test it with `raw_test_ds`, which yields raw strings\n",
    "loss, accuracy = export_model.evaluate(raw_test_ds)\n",
    "print(accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1/1 [==============================] - 0s 261ms/step\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[4.8793128e-04, 1.7936932e-02, 9.9783009e-01, 1.0000000e+00],\n",
       "       [5.0367224e-01, 7.6405799e-01, 2.2594877e-01, 3.4358475e-01]],\n",
       "      dtype=float32)"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "examples = [\n",
    "    \"blank pefile member question gang,..i apologize if this is a really dumb question...  i am wanting to use the super convenient blank script pefile (http://code.google.com/p/pefile/) that parses an executable and lists particular information about the pe structure.  my question is where can i find information about how to access particular members of the executable?  i've scoured the wiki and read the usage examples but that documentation only covered 4-5 members.  what i am wondering is if you guys have a list of members i can access to display the information i care about.  so specifically,  if i wanted to list the stack commit size of an executable, does it look like this: pe.file_header.stackcommitsize, obviously i can run this code and figure it out but have you guys seen api doc floating around that i find the members i need?..thanks!\",\n",
    "    \"how to specify the connection string if the excel file name contains white space?using blank string connstring = \"\"provider=microsoft.ace.oledb.12.0;data source=d:\\data\\[proj_resource details 20110118.xlsx];extended properties=excel 12.0\"\";...i mentioned [ ] still it is throwing exception.how can i solve this problem..plz mention the correct path\",\n",
    "]\n",
    "\n",
    "export_model.predict(examples)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
